다음 프로세스를 사용하여 종료하고 싶습니다.
pkill "run_tcp_sender.sh"
또는
pkill -SIGKILL "run_tcp_sender.sh"
root 14320 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22
root 14323 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22
root 14325 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22
root 14327 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22
root 14328 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22
root 14330 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22
하지만 프로세스는 여전히 쓸모가 없습니다. 내 명령에 무슨 문제가 있습니까?
참고: 다음 명령을 사용하여 원하는 것을 얻을 수 있습니다.
kill -9 $(ps -ef|grep "run_tcp"|grep -v "grep"|awk '{print $2}')
답변1
pkill
기본적으로 SIGTERM
중지 신호가 프로세스에 전송됩니다. 다음은 프로세스에 보낼 수 있는 신호 목록입니다. 일반적으로 이름이나 번호로 보낼 수 있습니다.
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
따라서 신호 #15를 보내려고 합니다. 프로세스가 이 신호에 응답하지 않으면 신호 #9 를 사용해야 할 수도 있습니다 pkill -SIGKILL
.
~에서pkill 매뉴얼 페이지:
-신호
Defines the signal to send to each matched process. Either the numeric or the symbolic signal name can be used. (pkill only.)
pkill 문제
OP는 자신이 일을 할 수 없었다고 언급했습니다 pkill -SIGKILL "run_tcp"
. 처음에는 이 문제가 pkill
모든 "run_tcp" 프로세스를 종료하기 전에 잠재적으로 자체 종료하는 것과 관련이 있다고 생각했습니다.
그러나 매뉴얼 페이지의 각주를 보면 이는 받아들이기 어렵습니다 pkill
.
실행 중인 pgrep 또는 pkill 프로세스는 자신을 일치 항목으로 보고하지 않습니다.
그 외에 @Gilles가 남긴 댓글은 pkill
자살하지 말라는 것 빼고는 기본적으로 똑같은 말을 했습니다. 그런 다음 그는 실제로 무슨 일이 일어나고 있는지에 대한 매우 중요한 단서를 제공했습니다.
다음은 OP와 나 자신이 무엇을 놓치고 있는지 보여주는 예입니다.
1단계 - sleepy.bash 스크립트 만들기
#!/bin/bash
sleep 10000
2단계 - 가짜 수면 작업 로드
$ for i in `seq 1 5`;do bash sleepy.bash & done
[1] 12703
[2] 12704
[3] 12705
[4] 12706
[5] 12707
3단계 - 실행 중인 작업 확인
$ ps -eaf|egrep "sleep 10000|sleepy"
saml 12703 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash
saml 12704 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash
saml 12705 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash
saml 12706 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash
saml 12707 29636 0 21:48 pts/16 00:00:00 bash sleepy.bash
saml 12708 12704 0 21:48 pts/16 00:00:00 sleep 10000
saml 12709 12707 0 21:48 pts/16 00:00:00 sleep 10000
saml 12710 12705 0 21:48 pts/16 00:00:00 sleep 10000
saml 12711 12703 0 21:48 pts/16 00:00:00 sleep 10000
saml 12712 12706 0 21:48 pts/16 00:00:00 sleep 10000
4단계 - 내 pkill을 사용해 보세요.
$ pkill -SIGTERM sleepy.bash
5단계 - 무슨 일이 일어났나요?
ps
위에서 명령을 실행하면 OP 질문과 마찬가지로 프로세스가 종료되지 않는 것을 볼 수 있습니다. 어떻게 되어가나요?
결과적으로 이것이 pkill
.command를 사용해 본 방법입니다.
pkill -SIGTERM "sleepy.bash"
이름이 사람을 찾고 있어요"졸린.bash". 음, 같은 이름을 가진 프로세스가 없습니다. 라는 프로세스가 있습니다."배쉬 doze.bash"하지만. 따라서 pkill
종료할 프로세스를 찾고 있지만 아무것도 찾지 못하고 종료됩니다.
따라서 우리 pkill
가 사용하는 것을 약간 조정하면 다음과 같습니다.
$ pkill -SIGTERM -f "sleepy.bash"
[1] Terminated bash sleepy.bash
[2] Terminated bash sleepy.bash
[3] Terminated bash sleepy.bash
[4]- Terminated bash sleepy.bash
[5]+ Terminated bash sleepy.bash
이제 원하는 효과를 얻었습니다. 차이점이 뭐야? 일치 시 프로세스 이름 대신 전체 명령줄 경로를 사용하는 -f
스위치를 사용했습니다 pkill
.pkill
pkill 매뉴얼 페이지에서
-f The pattern is normally only matched against the process name.
When -f is set, the full command line is used.
대체 방법
죽여라, 추신
이 방법은 매우 장황하지만 작업이 완료됩니다.
kill -9 $(ps -ef|grep "run_tcp"|grep -v "grep"|awk '{print $2}')
pkill 및 Killall이 포함된 pgrep
pgrep
대신 PID 목록을 제공 pkill
하거나 사용할 수 있습니다 killall
.
예
# pgrep solution
$ pgrep "run_tcp" | pkill -SIGKILL
# killall
killall -SIGKILL -r run_tcp
인용하다
답변2
이는 상위 프로세스 ID와 아무 관련이 없습니다. 문제는 단순히 실행 중인 모든 프로세스를 종료 run_tcp_sender.sh
하지만 그러한 프로세스가 없다는 것입니다. 관심 있는 프로세스가 실행 중입니다 bash
.
pkill
전체 명령줄에서 일치가 발생하도록 지시할 수 있습니다 .
pkill -f '^bash run_tcp_sender.sh'
또 다른 접근 방식은 스크립트가 열려 있는 모든 프로세스를 종료하는 것입니다. 이로 인해 방금 스크립트를 연 편집기가 손상되는 등 부수적인 손상이 발생할 수 있습니다.
fuser -k /path/to/run_tcp_sender.sh
스크립트를 루트로 편집하지 않는 한 루트 프로세스를 종료하면 문제가 해결됩니다.
kill $(lsof -uroot /path/to/run_tcp_sender.sh)
답변3
아래 명령은 간단하고 나에게 완벽하게 작동합니다! 위의 제안은 작동하지 않거나 비효율적입니다(너무 복잡함).
kill -9 $(pgrep -f somepattern)
kill 명령을 실행하기 전에 어떤 프로세스가 일치하는지 확인하는 것이 좋습니다.
pgrep -af somepattern
답변4
"신호 9"로 프로세스를 종료해 보십시오.
kill -9 PID
일반적으로 신호 9를 사용하여 데이터베이스 엔진을 종료하는 것은 권장되지 않습니다.
프로세스가 메모리에 남아 있으면 일부 I/O가 누락되었거나 프로세스가 I/O가 완료되기를 기다리고 있는 것입니다.