killall은 나에게`프로세스를 찾지 못했다`지만 ps


17

누군가가 나에게 사이의 차이를 설명 할 수 killkillall? 왜 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 비트)입니다. 커널 2.6.34-12; procps 버전 3.2.8; PSmisc 22.7의 killall; GNU coreutils 7.1에서 죽이기


SIGKILL (-9)로 프로세스를 종료 하지 마십시오 .
vonbrand 2016 년

프로세스를 종료해야 할 경우 어떻게해야합니까?
Radek

가장 마지막 수단입니다.
vonbrand

답변:


19

이것은 리눅스에 있습니까?

사용하는 명령 이름의 실제로 몇 미묘하게 다른 버전이 있습니다 ps, killall

두 가지 주요 변형은 다음과 같습니다. 1) 긴 명령 이름 ps u. 실행시 얻게되는 이름입니다 . 그리고 2) 짧은 명령 이름 ps. 플래그없이 실행할 때 얻는 것 입니다.

프로그램이 쉘 스크립트이거나 파이썬, 자바 등과 같은 인터프리터가 필요한 것이라면 가장 큰 차이가 발생합니다.

차이점을 보여주는 정말 간단한 스크립트가 있습니다. 나는 그것을 불렀다 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. 수행 ps -e | grep db2ps au | grep db2같은 명령 이름을 표시?

노트

다른 ps 플래그도 사용 ps -o comm하는 경우 짧은 이름과 ps -o cmd긴 이름을 보는 것이 더 간단 할 수 있습니다 .

pkill더 나은 대안을 찾을 수도 있습니다 . 특히 pkill -f전체 명령 이름을 사용하여 일치 시키려고합니다 (예 : ps u또는 로 인쇄 된 명령 이름) ps -o cmd.


아주 좋은 설명입니다. 그리고 당신이 처음 옳았다 고 생각합니다. ps -e |grep db2 gives me 3084? 00:00:00 db2syscr` 및 ps aux grep db2가 제공합니다 root 3084 0.0 0.6 579292 28304 ? S 13:02 0:00 db2ckpwd. 그것에 대해 언급 할 수 있습니다. 나는 조금 길을 잃었다.
Radek

잘 모르겠습니다. 프로그램 이름이 변경되었을 수 있습니다. 어떻게 작동하는지 아십니까? 무엇합니까 ls -l /proc/3084/exe말은? 어떤 약 which이나 whence또는 type파일을 찾을 수있는 다음 lstype는 심볼릭 링크 또는 스크립트 나 바이너리의 있는지?
Mikel

ls -l / proc / 3084 / exe는 우리에게lrwxrwxrwx 1 root root 0 Jun 6 16:49 /proc/3084/exe -> /var/lib/db2/db2inst1/sqllib/adm/db2syscr
Radek

ls -l / var / lib / db2 / db2inst1 / sqllib / adm / db2syscr이 알려줍니다-r-sr-s--- 1 root db2iadm1 147K Feb 1 23:32 /var/lib/db2/db2inst1/sqllib/adm/db2syscr*
Radek

유형은 / var / lib / db2 / db2inst1 / sqllib / adm / db2syscr/var/lib/db2/db2inst1/sqllib/adm/db2syscr is /var/lib/db2/db2inst1/sqllib/adm/db2syscr
Radek

6

killall은 프로세스 이름과 일치 시키려고하지만 일치하는 부분에는 적합하지 않습니다.

그리고 "ps | grep"과 "ps | grep | kill"이 훨씬 더 잘 작동하기 때문에 누군가 이것을 단순화하고 pgrep 및 pkill을 만들었습니다. "ps grep"및 "ps kill"과 같은 명령을 읽으십시오.이 명령은 먼저 ps 다음 grep을 원하고 원하는 경우 죽이기 때문입니다.


2

비슷한 문제가 있었지만 /proc/<pid>/stat예상되는 문자열이 포함되어 있습니다. strace를 사용하면 killall도 액세스 할 수 있습니다 /proc/<pid>/cmdline.

나는 gdb를 사용하여 계속 조사했다. 내 경우에는에서 찾은 모든 인수를 포함하여 전체 명령에 대한 명령을 확인하지 못했습니다 /proc/<pid>/cmdline. 파일 이름이 15 자보다 길기 때문에 코드의 경로가 트리거 된 것처럼 보입니다 (killall 소스의 하드 코드 된 값). 내가 어떻게 든 killall과 함께 작동하게 할 수 있는지 완전히 조사하지 않았습니다.

그러나 다른 의견에서 언급했듯이 pkill은 동일한 문제가없는 더 나은 대안입니다.

소스 코드는 https://github.com/acg/psmisc 에서 pkill찾을 수 있습니다 .


0

Ubuntu 16 시스템에서 / proc / pid / stat는 스레드의 이름을 포함합니다 (프로그램이 pthread_setname_np 시스템 호출을 통해 수행 할 수 있음) .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.