killall memberi saya `tidak ada proses yang ditemukan` kecuali ps

17

Bisakah seseorang menjelaskan kepada saya perbedaan antara killdan killall? Mengapa tidak killallmelihat pspertunjukan apa ?

# 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

Sistem adalah SuSe 11.3 (64 bit); kernel 2.6.34-12; procps versi 3.2.8; killall dari PSmisc 22.7; kill dari GNU coreutils 7.1

Radek
sumber
Jangan pernah mematikan proses dengan SIGKILL (-9).
vonbrand
Apa yang harus dilakukan ketika suatu proses perlu diakhiri?
Radek
Ini adalah pilihan terakhir.
vonbrand

Jawaban:

19

Apakah ini di Linux?

Sebenarnya ada beberapa versi berbeda dari nama perintah yang digunakan oleh ps,killall , dll

Dua varian utama adalah: 1) nama perintah panjang, yang adalah apa yang Anda dapatkan ketika Anda menjalankan ps u; dan 2) nama perintah pendek, yang Anda dapatkan saat Anda menjalankan pstanpa bendera.

Mungkin perbedaan terbesar terjadi jika program Anda adalah skrip shell atau apa pun yang membutuhkan juru bahasa, misalnya Python, Java, dll.

Inilah skrip yang benar-benar sepele yang menunjukkan perbedaan. Saya menyebutnya mycat:

#!/bin/sh
cat

Setelah menjalankannya, inilah dua jenis yang berbeda ps.

Pertama, tanpa u:

$ ps -p 5290
  PID TTY      ... CMD
 5290 pts/6    ... mycat

Kedua, dengan u:

$ ps u 5290
USER       PID ... COMMAND
mikel     5290 ... /bin/sh /home/mikel/bin/mycat

Perhatikan bagaimana versi kedua dimulai /bin/sh?

Sekarang, sejauh yang saya tahu, killallbenar-benar membaca /proc/<pid>/stat, dan mengambil kata kedua di antara parens sebagai nama perintah, jadi itu benar-benar yang perlu Anda tentukan saat menjalankan killall. Logikanya, itu harus sama dengan apa yang pstanpa ubendera mengatakan, tetapi itu adalah ide yang baik untuk memeriksa.

Hal-hal yang perlu diperiksa:

  1. apa cat /proc/<pid>/statkata perintah itu?
  2. apa ps -e | grep db2kata perintah itu?
  3. lakukan ps -e | grep db2dan ps au | grep db2tampilkan nama perintah yang sama?

Catatan

Jika Anda menggunakan flag ps lain juga, maka Anda mungkin merasa lebih mudah digunakan ps -o communtuk melihat nama pendek dan ps -o cmduntuk melihat nama panjang.

Anda juga mungkin menemukan pkillalternatif yang lebih baik. Secara khusus, pkill -fmencoba untuk mencocokkan menggunakan nama perintah lengkap, yaitu nama perintah seperti yang dicetak oleh ps uatau ps -o cmd.

Mikel
sumber
penjelasan yang sangat bagus. Dan saya kira Anda benar pertama kali. ps -e |grep db2 gives me 3084? 00:00:00 db2syscr` dan ps aux | grep db2 memberi saya root 3084 0.0 0.6 579292 28304 ? S 13:02 0:00 db2ckpwd. Bisa mengomentari itu. Saya agak tersesat.
Radek
Saya tidak yakin. Mungkin saja programnya mengubah namanya. Apakah Anda tahu cara menjalankannya? Apa yang ls -l /proc/3084/exedikatakan? Bagaimana dengan whichatau whenceatau typeuntuk menemukan file dan kemudian lsdan typeuntuk melihat apakah itu symlink atau skrip atau biner?
Mikel
ls-l / proc / 3084 / exe memberi kitalrwxrwxrwx 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 memberi saya-r-sr-s--- 1 root db2iadm1 147K Feb 1 23:32 /var/lib/db2/db2inst1/sqllib/adm/db2syscr*
Radek
tipe memberi saya / 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 mencoba mencocokkan pada nama proses (tetapi tidak benar-benar bagus di bagian yang cocok).

Dan karena "ps | grep" dan "ps | grep | kill" melakukan pekerjaan yang jauh lebih baik, seseorang menyederhanakan ini dan menciptakan pgrep dan pkill. Baca perintah itu seperti "ps grep" dan "ps kill", karena perintah itu pertama ps lalu grep dan jika ingin bunuh.

Johan
sumber
2

Saya memiliki masalah yang sama tetapi /proc/<pid>/statberisi string yang diharapkan. Dengan menggunakan strace saya bisa melihat bahwa killall juga diakses/proc/<pid>/cmdline .

Saya terus menyelidiki menggunakan gdb untuk menemukan bahwa dalam kasus saya gagal pada cek perintah saya ke perintah penuh termasuk semua argumen yang ditemukan di /proc/<pid>/cmdline. Sepertinya jalur kode dipicu karena nama file lebih panjang dari 15 karakter (yang merupakan nilai hardcode dalam sumber killall). Saya tidak sepenuhnya menyelidiki apakah saya bisa membuatnya bekerja dengan killall.

Tetapi seperti yang disebutkan dalam komentar lain di sini pkill adalah alternatif yang lebih baik yang tidak memiliki masalah yang sama.

Kode sumber pkilldapat ditemukan di sini https://github.com/acg/psmisc untuk yang berminat.

Zitrax
sumber
0

Pada sistem Ubuntu 16, / proc / pid / stat akan berisi nama utas (yang program dapat melalui system call pthread_setname_np .

gerardw
sumber