Killall은 "프로세스를 찾을 수 없습니다"라고 표시하지만 ps

Killall은 "프로세스를 찾을 수 없습니다"라고 표시하지만 ps

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 u2) 플래그 없이 실행할 때 얻는 짧은 명령 이름 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하지만 확인하는 것이 좋습니다.

확인해야 할 사항:

  1. cat /proc/<pid>/stat명령 이름이 무엇입니까?
  2. ps -e | grep db2명령 이름이 무엇입니까?
  3. Do ps -e | grep db2ps au | grep db2show의 명령 이름이 동일합니까?

노트

다른 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이 동일하게 작동합니다.

관련 정보