에서는 man page
다음과 같이 말합니다.
kill [ -s signal | -p ] [ -a ] [ -- ] pid ...
pid... Specify the list of processes that kill should signal. Each pid can be one of five things:
0 All processes in the current process group are signaled
나는 Bash에서 다음과 같은 것을 시도했습니다.
$ man kill &
[1] 15247
$
[1]+ Stopped man kill
$ kill 0
$ ps
15247 pts/41 00:00:00 man
여기에서는 로 0
사용됩니다 pid
. kill 0
현재 프로세스를 포함하여 현재 프로세스의 모든 프로세스를 종료합니다 pid15247
. 그러나 이 예에서는 아무 작업도 수행하지 않습니다. 누구든지 그것을 사용하는 방법에 대한 아이디어가 있습니까?
답변1
말한 대로 호출자의 프로세스 그룹의 모든 구성원에게 신호를 보냅니다.
프로세스 그룹은 셸에서 작업 제어를 구현하는 데 사용됩니다(다른 목적으로 사용될 수도 있지만 대화형 셸 작업 제어가 존재하는 주요 이유입니다).
를 입력하면 해당 Ctrl-C작업을 시작한 프로세스뿐만 아니라 현재 작업에 대한 모든 프로세스가 종료되는 것을 알 수 있습니다. 또한 이로 인해 백그라운드 작업이 종료되지 않습니다.
이는 프로세스 그룹을 통해 달성됩니다. 작업은 셸에 의해 시작된 프로세스 그룹으로, 백그라운드나 포그라운드에 배치되거나(또는 터미널의 포그라운드 프로세스 그룹으로 설정되지 않음) 전체적으로 종료될 수 있습니다.
ps -j
j
(ob 제어용 )을 사용하여 J프로세스 그룹 ID 및 세션 ID에 대한 정보를 찾을 수 있습니다 .
PGID에 대한 프로세스 그룹을 종료하려면 다음을 $x
수행할 수 있습니다.
kill -- "-$x"
kill 0
호출자의 프로세스 그룹을 종료합니다.
다음을 수행하면 /bin/kill 0
쉘은 kill
명령을 실행하기 위해 새 작업을 시작하므로 kill
자체 종료만 됩니다.
kill
일반적으로 이는 쉘에 내장되어 있으므로 kill
쉘의 프로세스 그룹을 종료합니다.
그러나 셸이 대화형인 경우 프로세스 그룹을 관리하는 것은 프로세스이므로 일반적으로 셸의 프로세스 그룹에는 다른 프로세스가 없습니다. 쉘에 의해 시작된 모든 프로세스는 다른 프로세스 그룹에 있습니다.
$ sleep 1000 &
[1] 22746
$ ps -j
PID PGID SID TTY TIME CMD
22735 22735 22735 pts/23 00:00:00 zsh
22746 22746 22735 pts/23 00:00:00 sleep
22749 22749 22735 pts/23 00:00:00 ps
위와 는 sleep
두 ps
개의 서로 다른 프로세스 그룹(백그라운드와 포그라운드)에 속하며 쉘의 프로세스 그룹과 다릅니다.
하지만 다음과 같이 할 수 있습니다.
(man kill & sleep 1; ps -j; kill 0)
대화형 쉘은 서브쉘을 위한 새로운 프로세스 그룹을 시작하고 서브쉘과 man(그리고 pager, groff와 같이 man이 시작한 다른 명령)은 동일한 프로세스 그룹에 있으므로 kill 0
그곳에서 작업할 수 있습니다. ( 위의 내용은 호출기를 종료하기 전에 출력에서 확인할 수 sleep
있도록 호출기에 충분한 시작 시간을 제공하는 것입니다 .)ps -j