
내 이해로는,직업은 파이프라인이다특정 셸에서 시작되었으며 이 셸 내에서 이러한 작업( fg
, , Ctrl-Z)을 관리할 수 있습니다. bg
작업은 여러 프로세스/명령으로 구성될 수 있습니다.
내 질문은 셸이 포함된 원본이 종료되면 이러한 작업에 어떤 일이 발생하는가입니다. huponexit가 설정되지 않아 셸이 종료된 후에도 백그라운드 프로세스가 계속 실행된다고 가정합니다.
내가 다음을 수행했다고 가정해 보겠습니다.
$ run.sh | grep 'abc' &
[1] job_id
그런 다음 이 쉘을 종료합니다. 새 셸에 들어가서 실행 jobs
해 보면 아무것도 보이지 않습니다. 그러나 나는 ps aux | grep run.sh
이 프로세스가 실행되는 것을 보고 볼 수 있으며 실행되는 ps aux | grep grep
프로세스도 보고 볼 것입니다 grep 'abc'
.
한 번에 종료할 수 있도록 전체 파이프라인에 대한 작업 ID를 가져올 수 있는 방법이 있습니까? 아니면 원래 셸을 종료한 후 다른 셸과 별도로 모든 프로세스를 종료해야 합니까? (후자를 시도해 보았는데 작동이 되지만, 모든 과정을 추적하는 것이 번거로운 것 같습니다.)
답변1
셸이 종료되면 HUP 신호를 백그라운드 작업으로 보낼 수 있으며 이로 인해 해당 작업이 종료될 수 있습니다. SIGHUP 신호는 쉘 자체가 SIGHUP을 수신하는 경우에만 전송됩니다. 즉, 터미널이 사라지는 경우에만(예: 터미널 에뮬레이터 프로세스가 종료되어) 쉘을 정상적으로 종료하는 경우(내장 exit
또는 Ctrl+ 를 입력하여 D) 전송되지 않습니다. 보다로그아웃할 때 SIGHUP이 작업으로 전송되지 않는 경우는 무엇입니까?그리고하위 프로세스가 상위 프로세스와 함께 종료되는 UNIX 변형이 있습니까?상세 사항은. Bash에서는 huponexit
일반 종료 시 SIGHUP을 백그라운드 작업으로 보내도록 옵션을 설정할 수 있습니다. ksh, bash 및 zsh에서 disown
작업을 호출하면 SIGHUP을 보낼 작업 목록에서 해당 작업이 제거됩니다. SIGHUP을 수신하는 프로세스는 신호를 무시하거나 포착할 수 있으며 그런 다음 종료되지 않습니다. nohup
프로그램을 실행할 때 사용 하면 SIGHUP에 영향을 받지 않습니다.
가능한 SIGHUP으로 인해 프로세스가 종료되지 않으면 프로세스는 뒤에 남아 있습니다. 쉘의 작업 번호와 연관시킬 수 있는 것은 아무것도 없습니다.
터미널에 액세스하려고 시도했지만 터미널이 더 이상 존재하지 않으면 프로세스가 계속 종료될 수 있습니다. 이는 프로그램이 존재하지 않는 터미널에 어떻게 반응하는지에 따라 다릅니다.
작업에 여러 프로세스(예: 파이프라인)가 포함된 경우 이러한 모든 프로세스는 하나의 프로세스에 있습니다.프로세스 그룹. 프로세스 그룹은 여러 관련 프로세스로 구성된 셸 작업의 개념을 포착하기 위해 정확하게 고안되었습니다. 프로세스 그룹 ID(PGID — 일반적으로 그룹에 있는 첫 번째 프로세스의 프로세스 ID)를 표시하여 프로세스 그룹별로 그룹화된 프로세스를 볼 수 있습니다(예: ps l
Linux 또는 ps -o pid,pgid,tty,etime,comm
이식 가능).
에 음수 인수를 전달하여 그룹의 모든 프로세스를 종료할 수 있습니다 kill
. 예를 들어, 종료하려는 파이프라인의 PGID가 1234라고 판단한 경우 다음을 사용하여 종료할 수 있습니다.
kill -TERM -1234
답변2
일반적으로 여전히 실행되지만 nohup을 사용해야 합니다. 잊어버렸거나 마음이 바뀌었다면 disown을 사용하세요.
mike@mike-laptop4:~$ sleep 500
^Z
[1]+ Stopped sleep 500
mike@mike-laptop4:~$ bg
[1]+ sleep 500 &
mike@mike-laptop4:~$ jobs
[1]+ Running sleep 500 &
mike@mike-laptop4:~$ disown %1
mike@mike-laptop4:~$ jobs
mike@mike-laptop4:~$