Я пишу сценарій 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, який не вбиває, але каже, якщо ви могли це зробити (тобто вам потрібен дозвіл, щоб подати сигнал про цей процес).