Я написал два сценария оболочки a.sh и b.sh. В a.sh и b.sh у меня есть бесконечный цикл for, и они печатают некоторый вывод на терминал. Я хочу написать еще один script, который вызывает как a.sh, так и b.sh, но я хочу, чтобы пользователь немедленно восстановил контроль над терминалом, вместо того, чтобы script работал бесконечно, и я хочу скрыть вывод в терминале.
Как запустить оболочку script в фоновом режиме и не получить вывод
Ответ 1
Используйте nohup
, если ваше фоновое задание занимает много времени, или вы просто используете SecureCRT или что-то вроде входа в систему на сервере.
Перенесите stdout и stderr на /dev/null
, чтобы игнорировать вывод.
nohup /path/to/your/script.sh > /dev/null 2>&1 &
Ответ 2
Перенаправить вывод в файл следующим образом:
./a.sh > somefile 2>&1 &
Это перенаправит как stdout, так и stderr в один и тот же файл. Если вы хотите перенаправить stdout и stderr в два разных файла, используйте это:
./a.sh > stdoutfile 2> stderrfile &
Вы можете использовать /dev/null
как один или оба файла, если вам не нравятся stdout и/или stderr.
Подробнее о перенаправлениях см. bash manpage.
Ответ 3
Простите, что это немного поздно, но найдено идеальное решение для сложных команд, где вы не хотите, чтобы какой-либо стандарт или ошибка выводились (кредит, при котором он должен: http://felixmilea.com/2014/12/running-bash-commands-background-properly/)
Это перенаправляет вывод на нуль и сохраняет разрешение экрана:
command &>/dev/null &
Ответ 4
Если они находятся в том же каталоге, что и ваш script, который содержит:
./a.sh > /dev/null 2>&1 &
./b.sh > /dev/null 2>&1 &
&
в конце - это то, что заставляет ваш script работать в фоновом режиме.
Часть > /dev/null 2>&1
не нужна - она перенаправляет потоки stdout и stderr, поэтому вам не нужно видеть их на терминале, что вы можете захотеть сделать для шумных скриптов с большим количеством выходных данных.