백그라운드 프로세스의 결과를 볼 수있는 이유는 무엇입니까?


31

예를 들어, 입력 할 때 ping 8.8.8.8 &핑 프로세스가 작동하는 이유는 무엇입니까? 그리고 입력 find / -name '*test*' &하면 모니터에서도 볼 수 있습니다.

왜 그런가요? 실제로 백그라운드에 있지 않습니까?

답변:


43

&명령은 쉘이 백그라운드에서 명령을 실행하도록 지시합니다. 즉, 별도의 하위 쉘에서 작업으로 비동기식으로 분기되어 실행됩니다.

당신이 둘 때주의 &모두 - 출력 표준 출력 및 표준 오류 - 계속 될 것입니다 화면에 인쇄 . 화면에 출력을 표시하지 않으려면 다음을 수행 하여 파일 stdoutstderr파일을 모두 리디렉션 하십시오.

myscript > ~/myscript.log 2>&1 &

일반적으로 나중에 오류 분석에 대해 걱정하지 않으면 stderr로 리디렉션 하여 버리기를 원할 수 있습니다 /dev/null.

별도의 하위 셸에서 명령 / 스크립트를 동시에 실행할 수도 있습니다. 예를 들어;

./script1 & ./script2 & ./script3 & 

백그라운드 작업은 명령 완료 전에 명령 행으로 다시 가져올 수 있습니다.

fg <job-number>

job-number실행하여 얻을 수 있습니다

jobs

좋은 대답입니다. /dev/null출력을 어딘가에 저장하지 않고 폐기하려는 경우 터미널 출력을 리디렉션하는 파일로 사용할 수도 있습니다 . 그리고 나는 그것이 2>&1리디렉션 stderr되는 것이 맞 stdout습니까? 어쩌면 당신은 그것을 명확히하고 싶을 수도 있습니다 ... 감사합니다.
바이트 사령관

@ByteCommander 감사합니다 :) 편집했습니다. 지금 명확 해지기를 바랍니다. 예, 맞습니다.로 2>&1리디렉션 stderr합니다 stdout.
Ron

3
stty tostop터미널에 쓰려고하면 백그라운드 작업이 일시 중단 될 수 있다고 언급 할 가치가 있다고 생각합니다 .
kasperd

cmd_with_params> / dev / null 2> / dev / null &
tgkprog

이를 수행하는 유일한 단점은 stdout 및 stderr에 대한 출력 순서가 로그 파일에서 혼합 될 수 있다는 것입니다.
matthieu

8

을 사용 &하면 프로세스가 백그라운드에서 실행 중입니다. 그러나 표준 출력은 여전히 ​​터미널입니다.

사실, 당신은 실행할 수 ping 8.8.8.8 &find / -name '*test*' &같은 시간에 (혼합 출력의 결과로),하지만 당신은 실행되지 않을 수 있습니다 ping 8.8.8.8find / -name '*test*'같은 쉘에서 동시에.

아무것도보고 싶지 않다면을 사용하십시오 ping 8.8.8.8 &> /dev/null &.


또한 nohup및 에 대해 배우고 싶을 수도 있습니다 disown.


disown출력이 터미널로 인쇄되는 것을 막지 않습니다.
Ruslan

@Ruslan : 아니오, 그러나 셸에서 작업을 제거합니다. OP가 관심을 가질만한 내용 일 수도 있고 아닐 수도 있습니다.
Andrea Corbellini
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.