Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

Если вы хотите иметь функцию для нее, то:

$running = posix_kill($pid,0);

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

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

Ответ 4

Я бы назвал bash script с помощью shell_exec

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

Ответ 5

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

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

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

<?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");
}

Ответ 6

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

<?php
//##########################################
// desc: Diese PHP скрипт 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");
?>

Ответ 7

//For Linux
$pid='475678';
exec('ps -C php -o pid', $a);
if(in_array($pid, $a)){
    // do something...
}