ps -ef 결과값에서 특정 프로세스 PID만 골라서 kill 해주고 싶습니다.
예를들면 ps -ef 치면 아래와 같이 결과가 나오는데
|
$ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 Dec02 ? 00:00:00 /init root 13 1 0 Dec02 ? 00:00:00 /init root 33 13 0 Dec02 ? 00:00:00 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups root 37 1 0 Dec02 ? 00:00:00 /init root 57 37 0 Dec02 ? 00:00:00 /usr/sbin/smbd -D root 61 57 0 Dec02 ? 00:00:00 /usr/sbin/smbd -D root 62 57 0 Dec02 ? 00:00:00 /usr/sbin/smbd -D root 63 57 0 Dec02 ? 00:00:00 /usr/sbin/smbd -D root 192 1 0 Dec02 ? 00:00:00 /init root 193 192 0 Dec02 ? 00:00:00 /init root 194 193 0 Dec02 pts/0 00:00:06 /mnt/wsl/docker-desktop/docker-desktop-user-distro proxy --distro-name Ubuntu --doc root 210 192 0 Dec02 ? 00:00:00 /init test 211 210 0 Dec02 pts/1 00:00:29 docker serve --address unix:///home/wiz/.docker/run/docker-cli-api.sock root 229 57 0 Dec02 ? 00:31:43 /usr/sbin/smbd -D root 6998 1 0 11:17 ? 00:00:00 /init root 6999 6998 0 11:17 ? 00:00:00 /init test 7000 6999 0 11:17 pts/2 00:00:00 -bash root 7404 1 0 13:38 ? 00:00:01 /init test 7405 7404 0 13:38 ? 00:00:00 [bash] <defunct> test 7482 7404 0 13:39 ? 00:00:00 ./test_server test 7887 7404 0 14:22 ? 00:00:00 ./test_server 11111 test 7946 7404 0 14:29 ? 00:00:00 ./test_server 11112 test 8041 7404 99 14:46 ? 02:49:38 ./test_server 11112 root 8044 1 0 14:47 ? 00:00:00 /init test 8045 8044 0 14:47 ? 00:00:00 [bash] <defunct> test 8511 8044 97 16:13 ? 01:20:58 ./test_server root 8529 1 0 16:17 ? 00:00:00 /init root 8530 8529 0 16:17 ? 00:00:00 /init test 8531 8530 0 16:17 pts/6 00:00:00 -bash test 9119 8530 0 17:23 pts/6 00:00:00 ./test_server 40004 test 9135 8530 0 17:24 pts/6 00:00:00 ./test_server 40005 test 9161 8530 0 17:26 pts/6 00:00:00 ./test_server 40007 test 9186 8530 0 17:28 pts/6 00:00:00 ./test_server 40008 test 9210 8530 0 17:33 pts/6 00:00:00 ./test_server 40009 test 9220 8531 0 17:36 pts/6 00:00:00 ps -ef |
위 결과에서 ./test_server 에 해당하는 PID만 골라서 kill 해주고 싶습니다.
|
sudo kill 7482 sudo kill 7887 sudo kill 7946 sudo kill 8041 sudo kill 8511 sudo kill 9119 sudo kill 9135 sudo kill 9161 sudo kill 9186 sudo kill 9210 |
테스트용 서버 프로그램 코딩하고 있는데, 계속 bind error 가 발생해서 구글링해보니
fork로 생성한 process가 살아있어서 socket bind 한게 풀리지 않아서
port를 계속 점유하고 있는 상황으로 보여집니다.
.sh 로 script 하나 만들어서 ps -ef 결과중에서 /test_server 에 해당하는 PID 값을 kill 해줄수 있는
스크립트 만들 수 있을지 조언 부탁 드립니다.
감사합니다. 알려주신 팁 응용해서 사용해보겠습니다.
알려주신 커맨드 실행해 보니 "kill: (880813): 그런 프로세스가 없음" 이라고 로그 1줄만 찍히는데
kill은 다 수행되어 ps -ef 결과가 클린해진 걸 확인할 수 있었습니다.
한가지 궁금한게 있습니다.
알려주신 커맨드 실행하면 "kill: (880813): 그런 프로세스가 없음" 이라고 로그 1줄만 찍혀서 이해가 잘 안되는 부분이 있습니다.
저는 bash script 에서 for 문같은거 돌려서 반복문으로 처리해야 할거라고 생각했는데
sudo kill `ps -ef | grep test_server | awk '{print $2}'` 한줄로 여러 개의 kill 명령이 처리되는게 맞는지...
해당 부분을 이해하려면 awk 를 이해해야 하는건지 궁금하여 추가 질문 드립니다.
에러 로그 한줄은 "grep test_server" 이 프로세스도 ps -ef 때 잡혀서 그걸 kill 할려고 해서 그런거고 무시하거나 아래 링크 보고 처리 하시면 되구요
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=hellowkorea&logNo=50096347788
두번째 질문은 답변적었다 저도 틀린거 같아 지웠는데..
이건 쉘에서 파이프라인을 통한 전달때 \n 처리에 따라서 그런게 아닐까 싶네요.. 일단 awk 공부와는 조금 별개 인건 맞습니다.
라고 하면 ps -ef 명령의 결과에서 test_server 라는 문구가 들어간 줄을 모두 골라내게 됩니다.
awk '{print $2}'
라고 하면 awk 에 입력된 결과에서 매 줄의 두번째 항목만 골라 출력하게 됩니다.
ps -ef 명령의 결과에서 PID에 해당하는 부분이 매번 두번째 항목이기 때문에 ps -ef 명령에서 test_server 라는 문구가 들어간 줄을 모두 골라내고, 각 줄의 두번째 항목인 PID 만을 출력하게 됩니다.
따라서,
ps -ef | grep test_server | awk '{print $2}'
를 실행한 결과는 ps -ef 명령의 결과에서 test_server 가 들어가는 줄의 PID 들만 나오는 것입니다.
sudo kill `ps -ef | grep test_server | awk '{print $2}'`
라고 하게 되면 ps -ef | grep test_server | awk '{print $2}' 명령을 수행한 결과를 sudo kill 의 파라미터로 넘깁니다.
kill 명령은 PID 여러개를 한꺼번에 받을 수 있기 때문에 for loop 같은거 필요 없이 그냥 한꺼번에 넘겨줘도 됩니다.
말씀하신 오류 (그런 프로세스가 없음) 는 ps -ef 명령어를 내릴 당시에는 grep test_server 라는 명령어도 돌아가고 있기 때문에 해당 프로세스의 PID도 포함되는데, sudo kill 명령이 실행되는 시점에서는 grep 명령어가 종료되어 해당 프로세스가 없기 때문에 나오는 것이니 무시하셔도 됩니다.
굳이 그런 오류도 보고 싶지 않으시다면,
sudo kill `ps -ef | grep test_server | grep -v grep | awk '{print $2}'`
처럼 해 주시면 grep 이 들어간 프로세스를 제외시켜줄 수 있습니다.
while IFS= read -r pid; do
sudo kill $pid
done <<< $(ps -ef | grep test_server | grep -v grep | awk '{print $2}')
처럼 while 문을 쓰셔도 되고,
pids=($(ps -ef | grep test_server | grep -v grep | awk '{print $2}'))
for pid in $pids; do
sudo kill $pid
done
처럼 for 문을 쓰셔도 됩니다.
자세한 설명 너무 감사 드립니다.
가르쳐주신 팁으로 script 응용해 잘 써먹을 수 있을거 같습니다.
아... killall 커맨드가 있는지를 모르고 있었습니다. ;;;
리눅스 경력 짧은게 여기서 드러나네요.
조언 감사합니다.
조언 감사합니다.
인연에 없던 서버 프로그램을 어거지로 찌려다보니 학생때 배우던 fork 써보면서 child 살아있능데 parent가 죽어버려서 애먹고 있습니다.
프로그램 종료될때 fork 로 생성된 모든 자식들 다 종료시켜야 할듯한데
쉽게 쉽게 안되네요.
에러 안나는 방법 알려주셔서 감사합니다.
sudo lsof -t -i:포트번호 -sTCP:LISTEN | xargs --no-run-if-empty kill -9
포트번호 활용하는 조언 정말 감사합니다.
pkill이 있는지도 모르고 있었습니다. 조언 감사 드립니다.
-프로세스 이름으로 종료시키기-
kill -9 `ps -ef | grep 프로세스이름 | grep -v grep | awk '{print $2}'`
killall -9 프로세스이름
pkill -9 -ef 프로세스이름
조언 감사합니다. killall 이나 pkill 커맨드를 몰랐는데 이번에 제대로 배워 앞으로 안까먹을거 같습니다.
이걸 사용하기 전에
ps x -o "%p %r %a" | grep [t]est_server 를 사용하여 확인하세요.
설명 감사합니다. 알려주신 내용 응용해보겠습니다.