Почему я вижу результаты фоновых процессов?


31

Например, когда я печатаю ping 8.8.8.8 &, почему мы видим, как работает процесс ping? И когда я печатаю find / -name '*test*' &, это также видно на мониторе.

Почему это? Разве это не в фоновом режиме?

Ответы:


43

&Направляет оболочку для запуска команды в фоновом режиме, то есть, он раздвоенный и запустить в отдельном субсчете оболочки, как работа, асинхронно.

Обратите внимание, что когда вы выводите &вывод - и stdout, и stderr - все равно будут выводиться на экран . Если вы не хотите видеть какие-либо выходные данные на экране, перенаправьте оба stdoutи stderrв файл с помощью:

myscript > ~/myscript.log 2>&1 &

Обычно вы можете отказаться stderrот перенаправления, /dev/nullесли вы не беспокоитесь об анализе ошибок позже.

Вы также можете запускать команды / сценарии одновременно, в отдельных вложенных оболочках. Например,

./script1 & ./script2 & ./script3 & 

Фоновое задание можно вернуть в командную строку, прежде чем оно завершится командой:

fg <job-number>

job-numberМожно получить, выполнив

jobs

Хороший ответ. Вы можете включить это /dev/nullв качестве файла для перенаправления вывода терминала, если хотите отбросить вывод вместо его сохранения где-либо. И я прав, что 2>&1перенаправляет stderrна stdout? Может быть, вы хотите уточнить это тоже ... Спасибо.
Byte Commander

@ByteCommander Спасибо :) отредактировал, надеюсь теперь понятно. Да, вы правы, 2>&1перенаправляет stderrна stdout.
Рон

3
Я думаю, что стоит упомянуть, что stty tostopфоновые задания будут приостановлены, если они попытаются выполнить запись в терминал.
Касперд

cmd_with_params> / dev / null 2> / dev / null &
tgkprog

Единственным недостатком этого является то, что порядок вывода в stdout и stderr может быть перепутан в файле журнала.
Матье

8

Когда вы используете &, процесс работает в фоновом режиме. Но его стандартный вывод - все еще терминал.

На самом деле, вы можете запускать ping 8.8.8.8 &и find / -name '*test*' &в одно и то же время (что приводит к смешанному выводу), но вы не можете запускать ping 8.8.8.8и find / -name '*test*'в одно и то же время в одной и той же оболочке.

Если вы не хотите ничего видеть, используйте что-то вроде ping 8.8.8.8 &> /dev/null &.


Кроме того, вы можете узнать о nohupи disown.


disownне препятствует выводу вывода на терминал.
Руслан

@Ruslan: нет, но он удаляет работу из оболочки. Что может (или не может) быть чем-то, что ОП может заинтересовать.
Андреа Корбеллини
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.