Я пишу сценарій Perl, який аналізує логіни для збору PID, а потім перевіряє, чи працює цей PID. Я намагаюся придумати найкращий спосіб зробити цю перевірку. Очевидно, я міг би зробити щось на кшталт:
system("ps $pid > /dev/null") && print "Not running\n";
Однак я вважаю за краще уникати системного дзвінка, якщо це можливо. Тому я думав, що можу використовувати /procфайлову систему (портативність не викликає занепокоєнь, це завжди буде працювати в системі Linux). Наприклад:
if(! -d "/proc/$pid"){
print "Not running\n";
}
Це безпечно? Чи можу я завжди вважати, що якщо немає /proc/$pid/каталогу, пов'язаний PID не працює? Я очікую цього, оскільки AFAIK psсам отримує свою інформацію з /procбудь-якого випадку, але оскільки це стосується виробничого коду, я хочу бути впевненим.
Отже, чи можуть бути випадки, коли запущений процес не має /proc/PIDкаталогу, або де /proc/PIDкаталог існує, а процес не працює? Чи є якась причина віддавати перевагу розбору psнад перевіркою на наявність каталогу?
kill -0це найкращий), це говорить лише про те, чи є запущений процес із заданим PID . Це не говорить про те, чи буде процес все ще запускатися на одну мілісекунду пізніше, і не говорить вам, чи є процес, який вас цікавить, або незв'язаний процес, якому було призначено той самий PID після того, як цікавий процес загинув . Практично завжди є помилкою перевірити, чи працює даний ПІД : дуже мало обставин, коли це не схильне до перегонів.
killфункція perl, використовуючи сигнал 0, який не вбиває, але каже, якщо ви могли це зробити (тобто вам потрібен дозвіл, щоб подати сигнал про цей процес).