Saya memiliki skrip init /etc/init.d/myservice
untuk menginisialisasi layanan seperti ini:
...
start() {
...
daemon /usr/sbin/myservice
...
}
stop() {
...
pgrep myservice
pidof myservice
ps -ef | grep myservice
...
}
Dan ketika saya mencoba menghentikan layanan, ini adalah output:
10000 10001
10000
root 10000 1 0 09:52 ? 00:00:02 /usr/sbin/myservice
root 9791 9788 0 10:06 pts/1 00:00:00 /bin/sh /sbin/service myservice stop
root 10001 9791 1 10:06 pts/1 00:00:00 /bin/sh /etc/init.d/myservice stop
root 9805 9796 0 10:06 pts/1 00:00:00 grep myservice
Apakah ini yang diharapkan? Mengapa pidof
mengembalikan hanya PID yang benar dari layanan yang ingin saya hentikan dan pgrep
mengembalikan PID layanan dan PID dari skrip init? Bisakah saya mengandalkan itu pidof
akan selalu mengabaikan PID dari skrip init?
sumber
pidof
tidak kembali10001
, karena programnyash
, bukan?Saya pikir Anda tidak harus bergantung pada
pidof
, itu dapat menyebabkan program Anda gagal. Contoh sederhana dengansupervisord
program:Anda dapat melihat,
supervisord
sebenarnya disebut oleh python interpreter, menyebabkanpidof
kegagalan:sumber
killproc
. Mengapa Anda tidak menggunakan ini saat Anda haved digunakandaemon
distart
fungsi?killproc
untuk membunuh proses itu sendiri.parent process
, ituchild process
akan mati juga.The
pidof
perintah mengabaikan script kecuali jika Anda termasuk-x
pilihan. Juga, paling aman untuk memasukkan path lengkap pada perintah pidof, seperti pada:ini meminimalkan kemungkinan pencocokan beberapa proses lainnya.
sumber