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