Выполнение команды оболочки в фоновом режиме от script
как я могу выполнить команду оболочки в фоновом режиме из bash script, если команда находится в строке?
Например:
#!/bin/bash
cmd="nohup mycommand";
other_cmd="nohup othercommand";
"$cmd &";
"$othercmd &";
это не работает - как я могу это сделать?
Ответы
Ответ 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 &