Как запустить скрипт в фоновом режиме и вам нет выхода


Я написал два сценария оболочки a.sh и b.sh. In a.sh и b.sh у меня есть бесконечный цикл for, и они печатают некоторые выходные данные на терминал. Я хочу написать другой скрипт, который вызывает оба a.sh и b.sh но я хочу, чтобы пользователь немедленно восстановил контроль над терминалом, вместо того, чтобы бесконечно запускать скрипт, и я хочу скрыть вывод в терминале.

8 79

8 ответов:

использовать nohup Если ваша фоновая работа занимает много времени, чтобы закончить или вы просто используете SecureCRT или что-то вроде этого войти на сервер.

перенаправить stdout и stderr до /dev/null игнорировать выход.

nohup /path/to/your/script.sh > /dev/null 2>&1 &

перенаправить вывод в файл, как это:

./a.sh > somefile 2>&1 &

Это позволит перенаправить stdout и stderr в один файл. Если вы хотите перенаправить stdout и stderr в два разных файла, используйте это:

./a.sh > stdoutfile 2> stderrfile &

можно использовать /dev/null как один или оба файла, если вы не заботитесь о stdout и / или stderr.

посмотреть bash manpage для получения дополнительной информации о перенаправлениях.

извините, это немного поздно, но нашел идеальное решение для некоторых команд, где вы не хотите никаких стандартных или ошибок вывода (кредит, где это должно:http://felixmilea.com/2014/12/running-bash-commands-background-properly/)

это перенаправляет вывод на null и сохраняет экран чистым:

command &>/dev/null &

, если они находятся в том же каталоге, где скрипт, который содержит:

./a.sh > /dev/null 2>&1 &
./b.sh > /dev/null 2>&1 &

The & в конце это то, что заставляет ваш скрипт работать в фоновом режиме.

The > /dev/null 2>&1 часть не нужна - она перенаправляет потоки stdout и stderr, поэтому вам не нужно видеть их на терминале, что вы можете сделать для шумных сценариев с большим количеством выходных данных.

запустите в подрешетке, чтобы удалить уведомления и закрыть STDOUT и STDERR:

(&>/dev/null script.sh &)
nohup sh -x runShellScripts.sh &

эти примеры прекрасно работают:

nohup sh prog.sh проглог.log 2>&1&

для цикла вы можете использовать вот так:

для i в {1..10}; do sh prog.sh; сон 1; сделано прог.log 2>&1&

Он работает в фоновом режиме и не показывает никаких выходных данных.

Если вы хотите запустить скрипт в linux kickstart вы должны запустить, как показано ниже .

sh /tmp/script.sh > /dev/null 2>&1 < /dev/null &