Как запустить команду в фоновом режиме и не получить результата?


111

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

Ответы:


222

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

Перенаправьте stdout и stderr на, /dev/nullчтобы игнорировать вывод.

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

Чтобы добавить, иногда для сценариев есть аргументы, тогда указанная выше команда вернет неоднозначное перенаправление вывода .
sabertooth1990

Лучший способ, который я нашел, - это использовать nohup /path/to/your/script.sh parameter1 > & 1 &Если кто-нибудь знает лучший способ.
sabertooth1990 06

18
Вам это не нужно, /dev/null 2>&1если вы используете, nohupпоскольку он уже автоматически добавляет все потоки STDOUT и STDERR в файл nohup.out. Используйте только:nohup /path/to/your/command &
Леонардо

1
@ sabertooth1990 Ваша командная строка неисправна:-bash: syntax error near unexpected token '&'
notes-jj

1
Как бы вы тогда убили созданный процесс?
Alexis_A

33

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

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

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

./a.sh > stdoutfile 2> stderrfile &

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

Подробную информацию о перенаправлениях см. На странице руководства bash .


23

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

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

command &>/dev/null &

2
Примечание: команда будет завершена при закрытии терминала.
Banana

1
Для тех, кто смотрит на это в будущем, кто хочет, чтобы команды продолжали работать после завершения сеанса, я бы предложил screen или tmux. Они существенно запускают «сеанс в рамках сеанса», который продолжается после закрытия первоначального сеанса. Затем вы можете повторно подключиться к текущему сеансу, если снова войдете в систему. Отлично подходит для выполнения резервного копирования rsync, например, когда синхронизация должна выполняться в течение длительного времени, и вы не хотите оставлять сеанс запущенным.
DanteAlighieri

13

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

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

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

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


7

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

(&>/dev/null script.sh &)

Это единственный ответ, который также не печатает журналы фоновых заданий в качестве [1] + 54765 done <emacs>благодарности
Альпер,

2

Если вы хотите запустить скрипт в кикстарте Linux, вам нужно запустить его, как показано ниже.

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


0

Эти примеры работают нормально:

nohup sh prog.sh proglog.log 2> & 1 &

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.