pkill은 상위 프로세스 ID 1을 사용하여 프로세스를 종료할 수 없습니다.

pkill은 상위 프로세스 ID 1을 사용하여 프로세스를 종료할 수 없습니다.

다음 프로세스를 사용하여 종료하고 싶습니다.

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가 완료되기를 기다리고 있는 것입니다.

관련 정보