kill
누군가 나에게 차이점을 설명해 줄 수 있습니까 killall
? 왜 killall
어떤 프로그램도 볼 수 없나요 ps
?
# ps aux |grep db2
root 1123 0.0 0.8 841300 33956 pts/1 Sl 11:48 0:00 db2wdog
db2inst1 1125 0.0 3.5 2879496 143616 pts/1 Sl 11:48 0:02 db2sysc
root 1126 0.0 0.6 579156 27840 pts/1 S 11:48 0:00 db2ckpwd
root 1127 0.0 0.6 579156 27828 pts/1 S 11:48 0:00 db2ckpwd
root 1128 0.0 0.6 579156 27828 pts/1 S 11:48 0:00 db2ckpwd
# killall db2ckpwd
db2ckpwd: no process found
# kill -9 1126
# kill -9 1127
# kill -9 1128
시스템은 SuSe 11.3(64비트), PSmisc 22.7의 procps 버전 3.2.8, GNU coreutils 7.1
답변1
이게 리눅스에 있나요?
ps
실제로 killall
등에서 사용되는 명령 이름에는 약간 다른 버전이 여러 개 있습니다.
두 가지 주요 변형은 다음과 같습니다. 1) 실행할 때 얻는 긴 명령 이름 ps u
2) 플래그 없이 실행할 때 얻는 짧은 명령 이름 ps
.
가장 큰 차이점은 프로그램이 쉘 스크립트이거나 인터프리터가 필요한 프로그램(예: Python, Java 등)인 경우 발생할 수 있습니다.
다음은 차이점을 보여주는 매우 간단한 스크립트입니다. 나는 그것을 이렇게 부른다 mycat
:
#!/bin/sh
cat
실행 후에는 두 가지 유형이 있습니다 ps
.
첫째, 다음이 없습니다 u
.
$ ps -p 5290
PID TTY ... CMD
5290 pts/6 ... mycat
둘째, 다음을 사용합니다 u
.
$ ps u 5290
USER PID ... COMMAND
mikel 5290 ... /bin/sh /home/mikel/bin/mycat
두 번째 버전이 어떻게 시작되는지 주목하세요 /bin/sh
.
이제 제가 아는 한 killall
실제로는 를 읽고 /proc/<pid>/stat
괄호 사이의 두 번째 단어를 명령 이름으로 가져오므로 런타임에 이를 지정해야 합니다 killall
. 논리적으로 이는 ps
플래그 없이 말하는 것과 동일 해야 u
하지만 확인하는 것이 좋습니다.
확인해야 할 사항:
cat /proc/<pid>/stat
명령 이름이 무엇입니까?ps -e | grep db2
명령 이름이 무엇입니까?- Do
ps -e | grep db2
와ps au | grep db2
show의 명령 이름이 동일합니까?
노트
다른 ps 플래그도 사용하는 경우 ps -o comm
짧은 이름 보기와 긴 이름 보기를 사용하는 것이 ps -o cmd
더 쉬울 수 있습니다.
pkill
더 나은 옵션을 찾을 수도 있습니다 . 특히 pkill -f
전체 명령 이름, 즉 ps u
또는 로 인쇄된 명령 이름을 사용하여 일치시키십시오 ps -o cmd
.
답변2
killall
프로세스 이름을 일치시키려고 시도합니다(그러나 부분 일치에는 실제로 좋지 않습니다).
ps | grep
과 가 더 나아졌기 때문에 ps | grep | kill
누군가 그것을 단순화하여 pgrep
과 를 만들었습니다 pkill
. 명령을 먼저 읽고 ps grep
명령 ps kill
을 읽고 싶으면 명령을 읽으 ps
십시오 .grep
답변3
비슷한 문제가 있었지만 /proc/<pid>/stat
예상되는 문자열을 포함했습니다. strace를 사용하면 Killall에도 액세스되는 것을 볼 수 있습니다 /proc/<pid>/cmdline
.
gdb를 사용하여 계속 조사한 결과 제 경우에는 전체 명령(포함)에 대한 명령을 확인하고 있음을 발견했습니다 /proc/<pid>/cmdline
. 파일 이름이 15자보다 길기 때문에 코드 경로가 발생한 것 같습니다. Killall 소스 코드) 및 트리거. 어떻게든 killall과 함께 작동하도록 할 수 있는지 완전히 조사하지 않았습니다.
그러나 다른 의견에서 언급했듯이 pkill이 더 나은 옵션이며 동일한 문제가 없습니다.
소스 코드는 pkill
여기에서 찾을 수 있습니다.https://github.com/acg/psmisc관심있는 분들을 위해.
답변4
대부분의 경우에는 작동합니다 kill PID
.
PID 사용 식별pgrep <application name>
여러 PID로 실행 중인 Google Chrome과 같은 애플리케이션을 종료한 경우
나는 killall "Google Chrome"
이것을 사용하여 모든 PID를 종료하여 응용 프로그램을 강제 종료합니다.
결론적으로: 애플리케이션에 PID가 여러 개 있는 경우 killall을 시도하고, PID가 하나만 있는 경우 kill과 killall이 동일하게 작동합니다.