Saya punya .pid
file, dan saya perlu memeriksa apakah prosesnya berjalan. Sejauh ini saya menemukan dua opsi
kill -0 `cat something.pid`
yang mencetak kesalahan jika pid tidak berjalan. Saya tahu ini dapat dialihkan ke /dev/null
, tetapi itu membuat saya berpikir bahwa ini bukan solusi terbaik.
Solusi kedua adalah menggunakan ps
, yang juga mencetak pada STDOUT
ps -ef `cat something.pid`
Apakah normal untuk mengarahkan output ke /dev/null
dan hanya menggunakan kode status yang dikembalikan, atau itu pertanda bahwa saya melakukan sesuatu yang salah dan saya perlu perintah yang berbeda?
kill -0
seperti standar (POSIX) -compliant.Jawaban:
untuk sebagian besar distro linux, enumerasi / proc / {pid} adalah cara yang baik untuk mendapatkan informasi tentang proses yang sedang berjalan, dan biasanya bagaimana perintah userspace seperti "ps" berkomunikasi dengan kernel. Jadi misalnya bisa Anda lakukan;
Sunting: Anda harus memeriksa bahwa kpid disetel, tetapi ini lebih berguna karena akan mengembalikan "tidak ada" untuk tidak disetel $ {kpid}
sumber
${kpid}
adaSeperti yang dicatat Anders, Anda harus menggunakannya
kill -0
untuk kepatuhan POSIX.Pada sistem Linux, Anda juga dapat memeriksa keberadaan file di sistem file / proc, misalnya,
sumber
Jika ini dalam skrip (yang saya asumsikan adalah kasus karena Anda khawatir tentang mencetak ke stdout) maka berikut ini adalah bagaimana Anda bisa melakukannya:
The
ps -p
penampilan untuk proses dengan pid ditentukan dalam something.pid (yang$()
sintaks adalah sedikit versi yang lebih baru dari backtick tersebut. Backtick perlu melarikan diri dalam keadaan tertentu yang bentuk baru tidak). Itu2>&1
pengalihan stderr untuk perintah itu juga.Jika
ps -p
perintah tidak menemukan proses dengan PID itu keluar dengan kesalahan> 0 danelse
dijalankan. Kalau tidak,kill
pernyataan. Anda dapat meniadakan hal di atas jika Anda ingin dengan melakukan:Semoga itu menjawab pertanyaan Anda. Tentunya berhati-hati dan banyak menguji ketika menggunakan perintah berbahaya seperti
kill
.sumber
Berikut ini beberapa opsi:
/etc/init.d/
) dan jika Anda menggunakan distro berbasis Debian, Anda sebaiknya menggunakanstart-stop-daemon
: Anda harus mendapatkan kode keluar 0 jika sedang berjalan.procps
paket:sumber
Jika Anda memiliki file pid, Anda dapat menggunakan pgrep untuk memeriksa apakah proses sedang berjalan:
sumber