bash에서 시작된 백그라운드 프로세스가 stdout을 화면에 인쇄하는 이유는 무엇입니까?

bash에서 시작된 백그라운드 프로세스가 stdout을 화면에 인쇄하는 이유는 무엇입니까?

내 상황을 이해하는 데 어려움이 있으며 지금까지는 Google이 별로 도움이 되지 않았습니다.

bash 백그라운드 작업을 시작했습니다.

ping google.com &

먼저 Bash가 stdout을 화면에 인쇄하는 것보다 프로세스 ID를 얻습니다.

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
...

이것은 내가 오늘 읽은 모든 내용과 모순됩니다. 저는 GNU bash 버전 4.3.30(1)-릴리스(x86_64-pc-linux-gnu)를 실행하는 표준 Debian Jessie 설정을 가지고 있습니다.

누구든지 나에게 이것을 설명해 줄 수 있습니까? 감사해요.

답변1

기본적으로 적어도 POSIX 호환 시스템의 경우 백그라운드에서 명령을 실행하면 &detaches 만 분리 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
$ 

지정 하면 tostopstdout에 쓰려고 할 때 백그라운드 프로세스가 중지됩니다. 계속 진행하려면 다시 전경으로 가져오면 됩니다.

$ fg
echo Hello
Hello
$

다시 전환하려면 를 실행하세요 stty -tostop. 이 실행 후,새로운생성된 백그라운드 작업은 stdout에 쓸 수 있습니다. (기존 직업에는 영향을 미치지 않습니다.)

선적 서류 비치

man sttytostop옵션에 대해 다음과 같이 설명합니다 .

* [-]
터미널에 쓰려고 하는 백그라운드 작업을 중지하려면

위의 앞부분은 *매뉴얼 페이지에서 이 옵션을 POSIX가 아닌 옵션으로 식별하는 데 사용됩니다.

관련 정보