오늘도 리눅스와 유닉스 환경에서의 간단한 명령어를 하나 끄적여보려고 합니다 :)
kill 명령어인데, 역할을 간단하게 말씀드리면 프로세스를 죽이는 명령어 입니다.
정확하게 내가 원하는 프로세스를 죽이기 위해서는 프로세스를 확인해야겠죠? 이 때는 ps -ef 또는 ps -efc 명령어를 사용합니다.
더 상세하게 내가 원하는 프로세스를 확인하기 위해서는 | grep 프로세스명 이렇게 추가해주시면 됩니다.
이런 느낌입니다.
ps -ef | grep CONFIG
or
ps -efc | grep CONFIG
파이프가 생소하시다면 아래 기술블로그를 참고해주세요 !
공부하기 쉽게 정리 해놓으셨습니다.
https://gracefulprograming.tistory.com/92
ps -ef 명령어로
프로세스를 확인하게 되면 아래와 같이 나옵니다.
(모든 프로세스의 모든 정보를 출력하게 됩니다)
이렇게 grep 으로 상세하게 설정해주지 않으면 무수히 많은 프로세스가 모두 확인된답니다.
그럼 | grep 으로 내가 원하는 부분만 나오도록 하게 되면
아래와 같이 나옵니다.
이제 kill 명령어를 사용할 때 입니다.
PID 값이 보이실 겁니다.
그렇습니다. 저 PID를 파라미터로 사용하여 kill 명령어를 가능하게 할 수 있답니다.
kill [PID]
그렇지만 !!!!!!
많은 기술블로그에서 프로세스를 죽일 때
kill -9 PID
를 사용하도록 권장하는 것 같습니다.
하지만 kill -9 로 시그널을 보내어 프로세스를 kill 하는 것은 문제가 많다고 합니다.
몇가지 이유들을 서칭해보았습니다.
" kill -9로 signal 을 보내면 개발자가 구현한 종료 함수가 호출되지 않고 즉시 프로세스가 종료되어 버리므로 데이타가 유실되거나 리소스가 제대로 안 닫히는 큰 문제가 발생할 수 있습니다."
출처- https://www.lesstif.com/system-admin/unix-linux-kill-12943674.html
"물론 프로세스에 SIGKILL 시그널을 보내 강제로 종료시킬 수도 있습니다. 그렇지만 일반적인 상황에서 SIGKILL 시그널을 보내는 것은 권장되지 않습니다. 본래 프로그램을 설계 할 때 대부분의 경우 종료 시그널을 받았을 때 처리하고 있던 데이터가 안전하게 정리 될 수 있도록 설계합니다. SIGTERM, SIGINT 등의 종료 시그널에 대해 시그널 핸들러(handler)를 등록하여 시그널이 수신되었을 때 연결된 Socket 또는 File을 close 하거나 Queue에 적재된 데이터를 File로 Dump하기도 합니다. 처리 중이던 데이터를 안전하게 정리/보관하여 데이터 유실을 방지하고 다시 실행하였을 때 기존 작업을 이어나갈 수 있게 하기 위함입니다. 그런데 SIGKILL 시그널은 프로그램에서 핸들러를 만들 수 없는 시그널이기 때문에 위와 같은 처리들을 구현 할 수 없습니다. 따라서 SIGKILL 시그널을 통해 프로세스를 강제로 종료해버리면 데이터 유실과 같은 문제가 생길 우려가 있습니다."
출처: https://gracefulprograming.tistory.com/127 [Peter의 우아한 프로그래밍:티스토리]
kill -KILL PID
or
kill -9 PID
프로세스를 안전하게 종료시키려면 위와 같이 SIGKILL을 통한 종료는 가급적 사용하지 않는게 좋습니다.
kill -l 을 하면 kill 명령어에 대한 상세정보들을 얻어 볼 수 있습니다.
처음에 말씀드렸듯이,
시그널은 숫자로 지정해도 되고 앞에 SIG를 빼고 이름을 넣어도 됩니다.
kill -INT PID
or
kill -2 PID
출처: https://gracefulprograming.tistory.com/127 [Peter의 우아한 프로그래밍:티스토리]
시그널을 보낼 때는
kill -(보낼 시그널) PID
이렇게 사용하는데, 지정된 PID를 갖는 프로세스에 지정된 시그널이 전달되는 구조입니다.
위에서 언급한 대로 아무런 시그널을 지정하지 않고 kill PID 이라고만 하면 SIGTERM 이 전달됩니다.
특정 이름의 프로세스 모두 종료하기
kill `ps -ef | grep 프로세스이름 | grep -v grep | awk '{print $2}'`
파이프와 grep, awk, 역따옴표(backticks : 백틱)을 조합하면 특정 이름의 프로세스를 모두 찾아서 종료 시킬 수 있습니다.
파이프와 grep은 리눅스에서 가장 많이 사용되는 명령어 조합 중에 하나로 이전 스트림의 출력값에 원하는 형식으로 필터링을 할 수 있습니다.
위 스크립트에서 프로세스이름 부분에 와일드카드 문자나 정규표현식도 사용 가능합니다.
grep -v 은 지정된 패턴과 일치하는 항목을 제외할 때 사용합니다.
여기서는 "grep 프로세스이름" 도 하나의 명령어기 때문에 "ps -ef | grep 프로세스이름" 의 결과에 포함되는데 kill 명령어에서 이를 제외시키기 위함입니다.
awk 명령어는 입력 값(record : 레코드)을 공백 문자로 분리하여 필드(field) 단위로 처리 할 수 있게 해주는 명령어입니다.
여기서는 ps -ef 명령어의 결과에서 PID를 추출하기 위해 사용됩니다.
마지막으로 `명령어` 백틱(backticks)은 치환 명령어라고도 하는데 ` ` 로 감싼 부분의 실행 결과로 치환됩니다.
결과적으로 kill `ps -ef | grep 프로세스이름 | grep -v grep | awk '{print $2}'` 에서 `ps -ef | grep 프로세스이름 | grep -v grep | awk '{print $2}'` 부분이 실행된 결과로 치환되어 kill PID 형태로 실행이 되는 것입니다.
참고 자료
https://gracefulprograming.tistory.com/92
https://gracefulprograming.tistory.com/126
https://gracefulprograming.tistory.com/127
https://www.lesstif.com/system-admin/unix-linux-kill-12943674.html
'OS > Linux&Unix' 카테고리의 다른 글
[Unix/Linux] 모든 사용자에게 권한을 부여하기 / sudoers (0) | 2022.09.14 |
---|---|
[Unix/Linux] find 명령어 (0) | 2022.09.07 |
Windows OS 와 Linux OS 의 Super user (0) | 2022.09.02 |
[Unix/Linux] [AIX] topas 명령어 / CPU, MEMORY, DISK 확인 (0) | 2022.09.02 |
[Unix/Linux] 유닉스 이전 명령어 사용하기 (0) | 2022.09.02 |