Подтвердить что ты не робот

Выполнение команды оболочки в фоновом режиме от script

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

Например:

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

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

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

4b9b3361

Ответ 1

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

$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~

Ответ 2

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

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 процесса, который запускает команда. Но внутри оболочки script будет отображаться без вывода.

Здесь функция для него:

#!/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/

Ответ 3

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

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

Ответ 4

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