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 /proc
file (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 ps
sendiri mendapatkan informasinya /proc
tetapi karena ini untuk kode produksi, saya ingin memastikan.
Jadi, dapatkah ada kasus di mana proses yang berjalan tidak memiliki /proc/PID
direktori atau di mana /proc/PID
direktori ada dan proses tersebut tidak berjalan? Apakah ada alasan untuk lebih memilih parsing ps
daripada memeriksa keberadaan direktori?
kill -0
yang 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.
kill
fungsi perl menggunakan sinyal 0 yang tidak membunuh tetapi mengatakan jika Anda bisa melakukannya (yaitu Anda perlu izin untuk memberi sinyal pada proses itu).