Я пишу 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 после того, как интересный процесс умер , Почти всегда ошибочно проверять, работает ли данный PID : очень мало обстоятельств, когда это не подвержено условиям гонки.
kill
функция perl, использующая сигнал 0, который не убивает, а говорит, что если вы можете это сделать (то есть вам нужно разрешение для сигнализации этого процесса).