it-swarm.com.ru

выполнение команды Shell в фоновом режиме из скрипта

как выполнить команду Shell в фоновом режиме из bash-скрипта, если команда находится в строке?

Например:

#!/bin/bash
cmd="Nohup mycommand";
other_cmd="Nohup othercommand";

"$cmd &";
"$othercmd &";

это не работает - как я могу это сделать?

39
user248237dfsf

Оставьте цитаты

$cmd &
$othercmd &

например:

[email protected] /tmp
$ cat test
#!/bin/bash

cmd="ls -la"

$cmd &


[email protected] /tmp
$ ./test

[email protected] /tmp
$ total 6
drwxrwxrwt+ 1 nicholas root    0 2010-09-10 20:44 .
drwxr-xr-x+ 1 nicholas root 4096 2010-09-10 14:40 ..
-rwxrwxrwx  1 nicholas None   35 2010-09-10 20:44 test
-rwxr-xr-x  1 nicholas None   41 2010-09-10 20:43 test~
43
ngoozeff

Построение ответа ngoozeff, если вы хотите, чтобы команда выполняла полностью в фоновом режиме (т. Е. Если вы хотите скрыть ее вывод и предотвратить ее уничтожение когда вы закрываете окно терминала), вы можете сделать это вместо этого:

cmd="google-chrome";
"${cmd}" &>/dev/null &disown;

& (первый) отсоединяет команду от stdin.
>/dev/null отсоединяет Сеанс оболочки от stdout и stderr.
&disown удаляет команду из список заданий Shell.

Вы также можете использовать &! вместо &disown; они оба одна и та же команда.

Кроме того, при помещении команды внутри переменной более уместно использовать eval "${cmd}", а не "${cmd}":

cmd="google-chrome";
eval "${cmd}" &>/dev/null &disown;

Если вы запустите эту команду непосредственно в терминале, она покажет PID процесса, который запускает команда. Но внутри сценария оболочки, без вывода будет показано.

Вот функция для этого:

#!/bin/bash

# Run a command in the background.
_evalBg() {
    eval "[email protected]" &>/dev/null &disown;
}

cmd="google-chrome";
_evalBg "${cmd}";

http://felixmilea.com/2014/12/running-bash-commands-background-properly/

25
GreenRaccoon23

Это работает, потому что это статическая переменная. Вы могли бы сделать что-то более крутое, например:

filename="filename"
extension="txt"
for i in {1..20}; do
    eval "filename${i}=${filename}${i}.${extension}"
    touch filename${i}
    echo "this rox" > filename${i}
done

Этот код создаст 20 файлов и динамически установит 20 переменных. Конечно, вы можете использовать массив, но я просто покажу вам функцию :). Обратите внимание, что вы можете использовать переменные $ filename1, $ filename2, $ filename3 ..., поскольку они были созданы с помощью команды оценки. В этом случае я просто создаю файлы, но вы можете использовать их для динамического создания аргументов команд, а затем выполнять в фоновом режиме.

0
jyz

Например, у вас есть стартовая программа с именем run.sh, чтобы запустить ее в фоновом режиме, выполните следующую командную строку ../run.sh &>/dev/null &

0
jokermt235