GNU/Linux >> Belajar Linux >  >> Linux

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

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:

  1. apa artinya cat /proc/<pid>/stat katakanlah nama perintahnya adalah?
  2. apa artinya ps -e | grep db2 katakanlah nama perintahnya adalah?
  3. lakukan ps -e | grep db2 dan ps 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.


Linux
  1. manajer langganan:perintah tidak ditemukan

  2. id:perintah tidak ditemukan

  3. w:perintah tidak ditemukan

  1. df:perintah tidak ditemukan

  2. du:perintah tidak ditemukan

  3. perintah linux ditemukan tetapi tidak ditemukan saat menggunakan sudo

  1. contoh Perintah killall di Linux

  2. ifrename:perintah tidak ditemukan

  3. rm:perintah tidak ditemukan