Apakah ini di Linux?
Sebenarnya ada beberapa versi nama perintah yang sedikit berbeda yang digunakan oleh ps
, killall
, dll.
Dua varian utamanya adalah:1) nama perintah yang panjang, yang Anda dapatkan saat menjalankan ps u
; dan 2) nama perintah singkat, yang Anda dapatkan saat menjalankan ps
tanpa bendera apa pun.
Mungkin perbedaan terbesar terjadi jika program Anda adalah skrip shell atau apa pun yang memerlukan juru bahasa, mis. Python, Java, dll.
Inilah skrip yang sangat sepele yang menunjukkan perbedaannya. Saya menyebutnya mycat
:
#!/bin/sh
cat
Setelah menjalankannya, inilah dua jenis 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 dengan /bin/sh
?
Sekarang, sejauh yang saya tahu, killall
sebenarnya membaca /proc/<pid>/stat
, dan ambil kata kedua di antara tanda kurung sebagai nama perintah, jadi itulah yang benar-benar perlu Anda tentukan saat menjalankan killall
. Logikanya, itu harus sama dengan ps
tanpa u
flag mengatakan, tetapi sebaiknya periksa.
Hal-hal yang perlu diperiksa:
- apa artinya
cat /proc/<pid>/stat
katakanlah nama perintahnya adalah? - apa artinya
ps -e | grep db2
katakanlah nama perintahnya adalah? - lakukan
ps -e | grep db2
danps au | grep db2
tampilkan nama perintah yang sama?
Catatan
Jika Anda juga menggunakan flag ps lainnya, mungkin lebih mudah menggunakan ps -o comm
untuk melihat nama pendek dan ps -o cmd
untuk melihat nama panjang.
Anda juga mungkin menemukan pkill
alternatif yang lebih baik. Khususnya, pkill -f
mencoba mencocokkan menggunakan nama perintah lengkap, yaitu nama perintah seperti yang dicetak oleh ps u
atau ps -o cmd
.
killall mencoba mencocokkan nama proses (tetapi tidak terlalu bagus di bagian pencocokan).
Dan karena "ps | grep" dan "ps | grep | kill" melakukan pekerjaan yang jauh lebih baik, seseorang menyederhanakan ini dan membuat pgrep dan pkill. Baca perintah seperti "ps grep" dan "ps kill", karena perintah itu pertama ps lalu grep dan jika ingin bunuh.
Saya memiliki masalah serupa tetapi /proc/<pid>/stat
berisi string yang diharapkan. Dengan menggunakan strace saya dapat melihat bahwa killall juga mengakses /proc/<pid>/cmdline
.
Saya terus menyelidiki menggunakan gdb untuk menemukan bahwa dalam kasus saya gagal saat memeriksa perintah saya ke perintah lengkap 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 di sumber killall). Saya tidak sepenuhnya menyelidiki apakah saya bisa membuatnya bekerja dengan killall.
Tapi seperti yang disebutkan di 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 tertarik.