말 그대로. 프로세스(ID)를 찾아내고, 죽이는 일까지 한번에 정리한다.
작업하다보면 특정 프로그램을 돌리기 전에, 다른 프로그램을 먼저 띄워야할 때가 있다. 즉, Z 를 돌리기 위해서 A 를 먼저 실행해야 하고, Z 가 끝나면 A 도 따라서 종료되어야 하는 상황.
물론, 수동으로 하면 되지만, 스크립트를 만들면 작업을 자동화 할 수 있다.
형식은 이렇다.
# 선행 프로그램 실행 /usr/bin/prog_A & # 본 프로그램 실행 /usr/bin/prog_Z # prog_A 죽이기 ???
이렇게 흘러가야만 한다. 선행프로그램을 실행할 때 뒤에 & 를 붙여줘야 BG 로 넘어가서 본 프로그램에 수행에 지장이 없게 된다.
여기까진 간단한데.. 문제는 prog_A 를 어떻게 찾아내서 종료시켜주느냐인데, 이를 위해 pgrep
가 등판할 차례가 됐다.
프로세스를 찾는 방법은 몇가지가 있다. 대표주자는 ps 와 pgrep. 헌데 ps 를 쓰면, 자기 자신까지 포함돼 버리는 현상이 있다.
그에 대한 자세한 얘기를, NixCraft 의 Vivek 이 세심하게 풀어써줬다. 그를 회피하는 방법도 regex 를 써서 고급스러운(?) 느낌이 난다.
그건 그거고, 여기선 그냥 단순하게 pgrep
를 사용하려고 한다. 다만, 그냥 pgrep 로는 원하는 결과가 나오지 않을 때가 있다. 이럴 땐 -f 를 붙여준다.
-f, --full The pattern is normally only matched against the process name. When -f is set, the full command line is used.
따라서 프로세스를 찾는 명령은 이렇게 된다.
pgrep -f 'prog_A'
찾고, 지우려면 xargs
를 사용하여 id 를 넘겨주고, kill
명령을 수행한다.
pgrep -f 'prog_A' | xargs kill
종합하면 이렇게 된다.
#!/usr/bin/env bash # 선행 프로그램 실행 /usr/bin/prog_A & # 본 프로그램 실행 /usr/bin/prog_Z # prog_A 죽이기 pgrep -f 'prog_A' | xargs kill
kill 로 충분하지 않다면 -9 를 붙여줄 수도 있다.
이 차이를 아주 잘 설명한 글을 찾았는데, kill 은 SIGTERM 을 보내고, -9 는 SIGKILL 을 보낸다고 한다. 둘간 차이는 강제성 유무. kill -9 이 더 강력하지만, 좀비를 유발할 가능성도 존재한다고 한다.