kill
kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Signals table 을 보면 알 수 있겠지만 대부분의 신호들은 치명적인 오류를 나타내고 default action 으로 프로세스가 종료됩니다. 그러므로 왜 신호를 보내는 명령 이름이 kill 인지 짐작을 할 수 있습니다. kill 명령으로 신호를 보낼때 신호값을 주지 않으면 기본값 또한 TERM 신호가 됩니다.
다음은 kill 명령 사용 예입니다. 신호명 앞에 SIG 를 제외하고 사용할 수 있고 소문자로 쓸 수도 있습니다. 또한 pid 대신에 jobspec 을 사용할 수 있습니다.
kill -TERM 4287
kill -SIGTERM 4287
kill -s TERM 4287
kill -s SIGTERM 4287
kill -15 4287
kill -n 15 4287
kill 4287 # 신호값을 주지 않으면 기본값은 TERM 신호가 된다.
kill 신호값 -pgid
kill 명령을 이용해 process group 에 신호를 보낼 수 있습니다.
이때는 pgid 앞에 -
문자를 붙여 사용합니다.
kill -TERM -4287
# 다음과 같은 경우는 -4287 이 pgid 가 아니라 신호값을 나타내는 인수로
# 인식되는 것을 방지하기 위해 -- 를 붙입니다.
# 신호값을 주지 않았으므로 기본값인 TERM 신호가 됩니다.
kill -- -4287
kill -0 pid
kill -0
은 실질적으로 신호를 보내지 않지만 프로세스가 아직 살아있는지, 살아있다면 신호를 보낼수있는 권한이 되는지 테스트 하는데 사용합니다.
$ kill -0 32630; echo $? # process 가 살아있고 신호를 보낼 수 있는 권한이 됨
0
$ kill -0 32631; echo $? # process 가 존재하지 않음
bash: kill: (32631) - No such process
1
$ kill -0 1; echo $? # process 가 존재하나 신호를 보낼 수 있는 권한이 안됨
bash: kill: (1) - Operation not permitted
1
kill 신호값 0
스크립트 실행 중에 특정 상황에서 자기 자신을 종료해야 될 때가 있습니다.
그런데 background 프로세스가 생성되어 실행 중이거나
스크립트 내에서 a.sh -> b.sh -> c.sh 순서로 호출하여 실행중에 있을경우 단순히 exit 명령을 사용하거나
kill -TERM $$
을 하는 것으로는 c.sh 만 종료가 되고
a.sh, b.sh 와 background 프로세스는 실행을 계속하게 됩니다.
이때 사용할수 있는 것이 kill -TERM 0
입니다.
여기서 0
은 프로세스 자신의 process group id 를 나타내는데 kill 명령은 shell 의 builtin 명령이므로
shell 과 같은 pgid 를 갖게 됩니다.
따라서 kill -TERM 0
은 c.sh 의 pgid 에 신호를 보내게 되고
결과적으로 같은 pgid 에 속하는 프로세스들이 모두 종료하게 됩니다.
# 스크립트 자신의 pgid 에 TERM 신호 보내기
kill -TERM 0
kill 0
----------------------------------
# 스크립트 자신의 pgid 에 INT 신호 보내기
kill -INT 0