выполнение команды оболочки в фоновом режиме из скрипта - PullRequest
40 голосов
/ 10 сентября 2010

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

Например:

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

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

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

Ответы [ 4 ]

44 голосов
/ 10 сентября 2010

Оставьте кавычки

$cmd &
$othercmd &

Например:

nicholas@nick-win7 /tmp
$ cat test
#!/bin/bash

cmd="ls -la"

$cmd &


nicholas@nick-win7 /tmp
$ ./test

nicholas@nick-win7 /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~
26 голосов
/ 16 апреля 2015

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

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

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

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

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

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

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

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

#!/bin/bash

# Run a command in the background.
_evalBg() {
    eval "$@" &>/dev/null &disown;
}

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

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

1 голос
/ 24 ноября 2017

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

1 голос
/ 10 сентября 2010

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

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 ..., поскольку они были созданы с помощью команды оценки. В этом случае я просто создаю файлы, но вы можете использовать их для динамического создания аргументов команд, а затем выполнять в фоновом режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...