내가 아는 한,일은 파이프라인이다이러한 작업을 관리할 수 있는 셸에서 실행합니다( 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:~$