Узнать запущен ли процесс по PID

430
24 февраля 2017, 03:30

Есть консольный скрипт (1), который при запуске пишет в базу свой PID полученный функцией getmypid()

И другой скрипт (2), который проверяет запущен ли процесс с заданным PID, для этого он использует команду вида:

tasklist /FI "PID eq 12348" | find "php.exe"

Исполняется команда через shell_exec

где 12348 - PID нужного процесса

Так вот в чём вопрос, если выполнить эту команду в консоли руками, то всё работает, процесс находится.

А сам скрипт выводит пустую строку:

 public static function isProcessRunning($pid)
    {
        $windowsCommand = 'tasklist /FI "PID eq ' . $pid . '" | find "php.exe"';
        $linuxCommand = "ps --pid " . $pid . " | grep php | grep " . $pid;
        $command = $windowsCommand;
        if (static::isLinuxOS()) {
            $command = $linuxCommand;
        }
        $output = shell_exec($command);
        var_dump($command);
        var_dump($output);
        return !empty(trim($output));
    }

В чём может быть проблема?

PS:

Если писать так, или вообще без аргументов

<?php
        var_dump(trim(shell_exec('tasklist /FI "PID eq 492"')));
    ?>

то всё работает так

Answer 1

Особенности запуска таких функций как shell_exec, exec, system в том что они пытаются сбросить буфер вывода, что при запуске из браузера приводит к потере данных. Поэтому их в данном случае использовать нельзя.

Это ошибка №1.

Запускаем процессы так:

$handle = popen($command, 'r');
$output = stream_get_contents($handle);
pclose($handle);
return $output;

Ошибка №2 заключалась в том что дополнительные команды Windows типа find или же просто tasklist могут выдавать надписи на русском языке (потому что система у меня русская) и использование trim выдавало неожиданные результаты. Необходимо использовать другие функции обработки строк и поиска совпадений.

Итоговая, правильная функции лежит тут: https://github.com/s4urp8n/common

READ ALSO
Как оптимизировать код php/mysql?

Как оптимизировать код php/mysql?

Как можно оптимизировать код, представленный ниже?

388
Асинхронные запросы PHP

Асинхронные запросы PHP

Подскажите как лучше организовать асинхронные запросы в PHP?

460
Есть ли кеширование запросов в IIS?

Есть ли кеширование запросов в IIS?

Можно ли IIS настроить так, чтобы, например, один и тот же запрос кешировался минут на 10 и пользователю возвращался сохраненный HTML вместо нового...

276
Опять сессии в CodeIgniter

Опять сессии в CodeIgniter

Реализовываю следующий модульДобавления товара в избранное

420