5

У меня проблемы с пониманием моей ситуации, и Google пока не очень помог.

Я начал фоновую работу Bash:

ping google.com &

Сначала я получаю идентификатор процесса, затем Bash выводит на экран стандартный вывод.

user@host:~$ ping google.com &
[1] 14004
user@host:~$ PING google.com (173.194.44.66) 56(84) bytes of data.
64 bytes from ham02s14-in-f2.1e100.net (173.194.44.66): icmp_seq=1 ttl=54 time=26.3 ms
64 bytes from ham02s14-in-f2.1e100.net (173.194.44.66): icmp_seq=2 ttl=54 time=27.4 ms
64 bytes from ham02s14-in-f2.1e100.net (173.194.44.66): icmp_seq=3 ttl=54 time=29.2 ms
...

Это противоречит всему, что я сегодня читаю. У меня есть стандартная установка Debian Jessie под управлением GNU bash, версия 4.3.30(1)-релиз (x86_64-pc-linux-gnu).

Кто-нибудь может мне это объяснить? Благодарю.

2 ответа2

9

По умолчанию, по крайней мере, для POSIX-совместимых систем, выполнение команды в фоновом режиме с использованием & отключает только стандартный stdin , так что вы сможете запускать другие команды. stdout и stderr по-прежнему подключены к родительской оболочке.

Если вы не хотите видеть stdout и / или stderr вы можете просто перенаправить их в файл или /dev/null:

command &>log.txt &                #stdout and stderr to log.txt
command 1>/dev/null &               #stdout to /dev/null, stderr still attached to shell
command 1>output.log 2>error.log &  #stdout to output.log, stderr to error.log
4

Будет ли выводиться вывод фонового процесса на терминале, зависит от вас. Вы можете изменить поведение с помощью утилиты stty .

пример

Значение по умолчанию позволяет фоновому процессу записывать в терминал:

$ echo Hello &
[1] 25850
Hello
$

Это поведение можно изменить с помощью команды stty :

$ stty tostop
$ echo Hello &
[2] 25873

[2]+  Stopped                 echo Hello
$ 

Если указан tostop , фоновый процесс останавливается при попытке записи в стандартный вывод. Если вы хотите, чтобы это продолжалось, вы можете вернуть его на передний план:

$ fg
echo Hello
Hello
$

Чтобы переключиться обратно, запустите stty -tostop . После этого новым созданным фоновым заданиям будет разрешено записывать в стандартный вывод. (Существующие рабочие места не будут затронуты.)

Документация

man stty объясняет опцию tostop следующим образом:

* [-]прекратить
остановить фоновые задания, которые пытаются записать в терминал

Верхний знак * указанный выше, используется страницей руководства для определения этой опции как не POSIX.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .