Bisakah seseorang menjelaskan kepada saya perbedaan antara kill
dan killall
? Mengapa tidak killall
melihat ps
pertunjukan 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
Jawaban:
Apakah ini di Linux?
Sebenarnya ada beberapa versi berbeda dari nama perintah yang digunakan oleh
ps
,killall
, dllDua 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 menjalankanps
tanpa 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
:Setelah menjalankannya, inilah dua jenis yang berbeda
ps
.Pertama, tanpa
u
:Kedua, dengan
u
:Perhatikan bagaimana versi kedua dimulai
/bin/sh
?Sekarang, sejauh yang saya tahu,
killall
benar-benar membaca/proc/<pid>/stat
, dan mengambil kata kedua di antara parens sebagai nama perintah, jadi itu benar-benar yang perlu Anda tentukan saat menjalankankillall
. Logikanya, itu harus sama dengan apa yangps
tanpau
bendera mengatakan, tetapi itu adalah ide yang baik untuk memeriksa.Hal-hal yang perlu diperiksa:
cat /proc/<pid>/stat
kata perintah itu?ps -e | grep db2
kata perintah itu?ps -e | grep db2
danps au | grep db2
tampilkan nama perintah yang sama?Catatan
Jika Anda menggunakan flag ps lain juga, maka Anda mungkin merasa lebih mudah digunakan
ps -o comm
untuk melihat nama pendek danps -o cmd
untuk melihat nama panjang.Anda juga mungkin menemukan
pkill
alternatif yang lebih baik. Secara khusus,pkill -f
mencoba untuk mencocokkan menggunakan nama perintah lengkap, yaitu nama perintah seperti yang dicetak olehps u
ataups -o cmd
.sumber
ps -e |grep db2 gives me
3084? 00:00:00 db2syscr` dan ps aux | grep db2 memberi sayaroot 3084 0.0 0.6 579292 28304 ? S 13:02 0:00 db2ckpwd
. Bisa mengomentari itu. Saya agak tersesat.ls -l /proc/3084/exe
dikatakan? Bagaimana denganwhich
atauwhence
atautype
untuk menemukan file dan kemudianls
dantype
untuk melihat apakah itu symlink atau skrip atau biner?lrwxrwxrwx 1 root root 0 Jun 6 16:49 /proc/3084/exe -> /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*
/var/lib/db2/db2inst1/sqllib/adm/db2syscr is /var/lib/db2/db2inst1/sqllib/adm/db2syscr
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.
sumber
Saya memiliki masalah yang sama tetapi
/proc/<pid>/stat
berisi 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
pkill
dapat ditemukan di sini https://github.com/acg/psmisc untuk yang berminat.sumber
Pada sistem Ubuntu 16, / proc / pid / stat akan berisi nama utas (yang program dapat melalui system call pthread_setname_np .
sumber