내 상황을 이해하는 데 어려움이 있으며 지금까지는 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
$
지정 하면 tostop
stdout에 쓰려고 할 때 백그라운드 프로세스가 중지됩니다. 계속 진행하려면 다시 전경으로 가져오면 됩니다.
$ fg
echo Hello
Hello
$
다시 전환하려면 를 실행하세요 stty -tostop
. 이 실행 후,새로운생성된 백그라운드 작업은 stdout에 쓸 수 있습니다. (기존 직업에는 영향을 미치지 않습니다.)
선적 서류 비치
man stty
tostop
옵션에 대해 다음과 같이 설명합니다 .
* [-]
터미널에 쓰려고 하는 백그라운드 작업을 중지하려면
위의 앞부분은 *
매뉴얼 페이지에서 이 옵션을 POSIX가 아닌 옵션으로 식별하는 데 사용됩니다.