Почему фоновый процесс, запущенный в bash, выводит стандартный вывод на экран?


8

У меня проблемы с пониманием моей ситуации, и 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).

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

Ответы:


13

По умолчанию, по крайней мере, для 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

На MacOSX это не работает.
Ожье Шелвис

@OgierSchelvis: Конечно, это так.
Ник Маттео

Есть ли способ присоединить stdinв этом случае?
Аликов

7

Будет ли выводиться вывод фонового процесса на терминале, зависит только от вас. Вы можете изменить поведение с помощью 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.

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