Saya sedang menulis skrip Perl yang mem-parsing file log untuk mengumpulkan PID dan kemudian memeriksa apakah PID itu berjalan. Saya mencoba memikirkan cara terbaik untuk melakukan pemeriksaan itu. Jelas, saya bisa melakukan sesuatu seperti:
system("ps $pid > /dev/null") && print "Not running\n";
Namun, saya lebih suka menghindari panggilan sistem jika memungkinkan. Karena itu saya pikir saya bisa menggunakan sistem /procfile (portabilitas bukan masalah, ini akan selalu berjalan pada sistem Linux). Sebagai contoh:
if(! -d "/proc/$pid"){
print "Not running\n";
}
Apakah itu aman? Bisakah saya selalu berasumsi bahwa jika tidak ada /proc/$pid/direktori PID terkait tidak berjalan? Saya berharap demikian karena AFAIK pssendiri mendapatkan informasinya /proctetapi karena ini untuk kode produksi, saya ingin memastikan.
Jadi, dapatkah ada kasus di mana proses yang berjalan tidak memiliki /proc/PIDdirektori atau di mana /proc/PIDdirektori ada dan proses tersebut tidak berjalan? Apakah ada alasan untuk lebih memilih parsing psdaripada memeriksa keberadaan direktori?
kill -0yang terbaik), ini hanya memberi tahu Anda apakah ada proses yang berjalan dengan PID yang diberikan . Itu tidak memberi tahu Anda apakah proses masih akan berjalan satu milidetik kemudian, dan tidak memberi tahu Anda apakah proses tersebut adalah yang Anda minati atau proses yang tidak terkait yang mendapat PID yang sama setelah proses yang menarik tersebut selesai . Hampir selalu merupakan kesalahan untuk menguji apakah suatu PID berjalan : ada sangat sedikit keadaan di mana ini tidak rentan terhadap kondisi balapan.
killfungsi perl menggunakan sinyal 0 yang tidak membunuh tetapi mengatakan jika Anda bisa melakukannya (yaitu Anda perlu izin untuk memberi sinyal pada proses itu).