오늘도 리눅스와 유닉스 환경에서의 간단한 명령어를 하나 끄적여보려고 합니다 :)
kill 명령어인데, 역할을 간단하게 말씀드리면 프로세스를 죽이는 명령어 입니다.
정확하게 내가 원하는 프로세스를 죽이기 위해서는 프로세스를 확인해야겠죠? 이 때는 ps -ef 또는 ps -efc 명령어를 사용합니다.
더 상세하게 내가 원하는 프로세스를 확인하기 위해서는 | grep 프로세스명 이렇게 추가해주시면 됩니다.
이런 느낌입니다.
ps -ef | grep CONFIG
or
ps -efc | grep CONFIG
파이프가 생소하시다면 아래 기술블로그를 참고해주세요 !
공부하기 쉽게 정리 해놓으셨습니다.
https://gracefulprograming.tistory.com/92
[Linux] 파이프(pipe)에 대한 이해
개요 안녕하세요 피터입니다. 오늘은 리눅스의 파이프(pipe)에 대해서 설명드리겠습니다. 파이프는 재지향(redirection)과 더불어 리눅스의 명령어들을 훨씬 강력하게 무장시켜주는 역할을 하는
gracefulprograming.tistory.com
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
[Linux] 파이프(pipe)에 대한 이해
개요 안녕하세요 피터입니다. 오늘은 리눅스의 파이프(pipe)에 대해서 설명드리겠습니다. 파이프는 재지향(redirection)과 더불어 리눅스의 명령어들을 훨씬 강력하게 무장시켜주는 역할을 하는
gracefulprograming.tistory.com
https://gracefulprograming.tistory.com/126
[Linux] ps 로 실행 중인 프로세스 확인하기
개요 ps 명령어는 리눅스에서 현재 실행중인 프로세스를 확인하는 명령어 입니다. Process Status에서 따온 이름이죠. 이름 그대로 명령어를 실행하면 현재 실행되고 있는 프로세스들의 정보를 화면
gracefulprograming.tistory.com
https://gracefulprograming.tistory.com/127
[Linux] kill 프로세스를 '안전하게' 종료시켜보자
개요 kill 명령어는 이름 때문에 프로세스를 강제로 종료시키는 명령어로 오해를 사기 쉬운데 실제로는 프로세스에 시그널(signal)을 보내는 명령어입니다. 이름이 kill 인 이유는 어떤 시그널을 보
gracefulprograming.tistory.com
https://www.lesstif.com/system-admin/unix-linux-kill-12943674.html
Unix, Linux 에서 kill 명령어로 안전하게 프로세스 종료 시키는 방법
여기를 클릭하여 펼치기... 위 쓰레드에서 발췌한 killtree.sh #!/bin/bash killtree() { local _pid=$1 local _sig=${2:-TERM} kill -stop ${_pid} # needed to stop quickly forking parent from producing child between child killing and parent ki
www.lesstif.com
'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 |