Мне сложно понять свою ситуацию, и 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.