killall ให้ฉัน "ไม่พบกระบวนการ" นอกจาก ps


17

ใครสามารถอธิบายให้ฉันความแตกต่างระหว่าง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 บิต); เคอร์เนล 2.6.34-12; procps เวอร์ชัน 3.2.8; killall จาก PSmisc 22.7; ฆ่าจาก GNU coreutils 7.1


อย่าฆ่ากระบวนการด้วย SIGKILL (-9)
vonbrand

จะทำอย่างไรเมื่อกระบวนการจำเป็นต้องยกเลิก
Radek

นี่คือที่พึ่งสุดท้าย
vonbrand

คำตอบ:


19

อยู่บน Linux หรือไม่

มีจริงไม่กี่รุ่นที่แตกต่างกันอย่างละเอียดชื่อคำสั่งที่ใช้โดยมี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และคว้าคำที่สองในระหว่าง parens killallเป็นชื่อคำสั่งเพื่อให้ที่จริงสิ่งที่คุณจะต้องมีการระบุเมื่อคุณเรียกใช้ ตามหลักเหตุผลนั้นควรเป็นสิ่งเดียวกับที่psไม่มีการuตั้งค่าสถานะ แต่ควรตรวจสอบ

สิ่งที่ต้องตรวจสอบ:

  1. สิ่งที่ไม่cat /proc/<pid>/statพูดชื่อคำสั่งคืออะไร?
  2. สิ่งที่ไม่ps -e | grep db2พูดชื่อคำสั่งคืออะไร?
  3. ทำps -e | grep db2และps au | grep db2แสดงชื่อคำสั่งเดียวกันหรือไม่

หมายเหตุ

หากคุณกำลังใช้การตั้งค่าสถานะ ps อื่น ๆ ด้วยคุณอาจพบว่าการใช้ps -o commชื่อสั้นและps -o cmdดูชื่อยาวนั้นง่ายกว่า

คุณอาจพบpkillทางเลือกที่ดีกว่า โดยเฉพาะอย่างยิ่งpkill -fพยายามเพื่อให้ตรงกับการใช้ชื่อคำสั่งเต็มคือชื่อคำสั่งเป็นพิมพ์หรือps ups -o cmd


คำอธิบายที่ดีมาก และฉันคิดว่าคุณพูดถูกครั้งแรก ps -e |grep db2 gives me 3084 00:00:00 db2syscr` และ PS aux | DB2 grep root 3084 0.0 0.6 579292 28304 ? S 13:02 0:00 db2ckpwdให้ฉัน สามารถแสดงความคิดเห็นในที่ ฉันหลงทางนิดหน่อย
Radek

ฉันไม่แน่ใจ. เป็นไปได้ว่าโปรแกรมกำลังเปลี่ยนชื่อ คุณรู้หรือไม่ว่ามันทำงานอย่างไร สิ่งที่ไม่ls -l /proc/3084/exeพูด? สิ่งที่เกี่ยวกับwhichหรือwhenceหรือtypeจะหาไฟล์แล้วlsและtypeเพื่อดูว่ามันเป็น symlink หรือสคริปต์หรือไบนารี?
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 จะพบว่าในกรณีของฉันมันล้มเหลวในการตรวจสอบคำสั่งของฉันกับคำสั่งเต็มรูปแบบรวมทั้ง args /proc/<pid>/cmdlineทั้งหมดที่พบใน ดูเหมือนว่าเส้นทางของรหัสที่ถูกเรียกเนื่องจากชื่อไฟล์ยาวกว่า 15 ตัวอักษร (ซึ่งเป็นค่า hardcoded ในแหล่งที่มาของ killall) ฉันไม่ได้ตรวจสอบอย่างเต็มที่หากฉันสามารถทำให้มันทำงานกับ Killall ได้

แต่ดังที่ได้กล่าวไว้ในความคิดเห็นอื่น ๆ ที่นี่ pkill เป็นทางเลือกที่ดีกว่าที่ไม่มีปัญหาเดียวกัน

รหัสแหล่งที่มาของpkillสามารถพบได้ที่นี่https://github.com/acg/psmiscสำหรับผู้ที่สนใจ


0

บนระบบ Ubuntu 16 ระบบ / proc / pid / stat จะมีชื่อของเธรด (ซึ่งโปรแกรมสามารถผ่านการเรียกระบบpthread_setname_np

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.