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

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

Мне сложно понять свою ситуацию, и 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)-release (x86_64-pc-linux-gnu).

Кто-нибудь может мне это объяснить? Спасибо.

решение1

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

решение2

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

Пример

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

$ echo Hello &
[1] 25850
Hello
$

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

$ stty tostop
$ echo Hello &
[2] 25873

[2]+  Stopped                 echo Hello
$ 

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

$ fg
echo Hello
Hello
$

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

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

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

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

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

Связанный контент