Как проверить, работает ли указанный PID в настоящий момент, не вызывая ps из PHP?

Мы хотели бы проверить, запущен ли указанный процесс через PHP.

Мы хотели бы просто предоставить PID и посмотреть, выполняется ли он в настоящее время или нет.

Есть ли у PHP внутренняя функция, которая предоставит нам эту информацию или нам придется анализировать ее из вывода «ps»?

Если вы находитесь в Linux, попробуйте следующее:

if (file_exists( "/proc/$pid" )){ //process with a pid = $pid is running } 

posix_getpgid($pid); вернет false, когда процесс не запущен

Если вы хотите, чтобы у него была функция, тогда:

 $running = posix_kill($pid,0); 

Отправьте сигнал sig в ​​процесс с идентификатором процесса pid.

Вызов posix_kill с сигналом 0 kill вернет true если процесс запущен, в противном случае – false .

Я бы назвал сценарий bash, используя shell_exec

 $pid = 23818; if (shell_exec("ps aux | grep " . $pid . " | wc -l") > 0) { // do something } 

Я думаю, posix_kill(posix_getpgrp(), 0) – лучший способ проверить, работает ли PID, он доступен только на платформах Windows.

Это то же самое, что kill -0 PID на оболочке и shell_exec('kill -0 PID') на PHP, но нет вывода ERROR, когда pid не существует.

В раздвоенном дочернем процессе posix_getpgid возвращает родительский pid всегда, даже если родительский posix_getpgid был прерван.

 <?php $pid = pcntl_fork(); if ($pid === -1) { exit(-1); } elseif ($pid === 0) { echo "in child\n"; while (true) { $pid = posix_getpid(); $pgid = posix_getpgid($pid); echo "pid: $pid\tpgid: $pgid\n"; sleep(5); } } else { $pid = posix_getpid(); echo "parent process pid: $pid\n"; exit("parent process exit.\n"); } 

я сделал для этого сценарий, который im использует в wordpress для отображения статуса игрового сервера, но это будет работать со всем запуском процесса на сервере

 <?php //########################################## // desc: Diese PHP Script zeig euch ob ein Prozess läuft oder nicht // autor: seevenup // version: 0.2 //########################################## if (!function_exists('server_status')) { function server_status($string,$name) { $pid=exec("pidof $name"); exec("ps -p $pid", $output); if (count($output) > 1) { echo "$string: <font color='green'><b>RUNNING</b></font><br>"; } else { echo "$string: <font color='red'><b>DOWN</b></font><br>"; } } } //Beispiel "Text zum anzeigen", "Prozess Name auf dem Server" server_status("Running With Rifles","rwr_server"); server_status("Starbound","starbound_server"); server_status("Minecraft","minecarf"); ?> 
 //For Linux $pid='475678'; exec('ps -C php -o pid', $a); if(in_array($pid, $a)){ // do something... }