Проверьте, запущен ли процесс с использованием PHP в Linux - PullRequest
12 голосов
/ 19 июня 2011

Я использую Канал для отправки SMS через PHP.Я хочу знать, как я могу проверить, работает ли определенный процесс.Для запуска kannel процесс с именем bearerbox должен выполняться все время.Я хочу проверить, работает ли этот процесс или нет.Потому что, если процесс не запущен, мне будет отправлено письмо с уведомлением об этом.

Ответы [ 5 ]

25 голосов
/ 19 июня 2011

Самое простое - использовать pgrep, код завершения которого равен 0, если процесс существует, в противном случае - 1.

Вот пример.

exec("pgrep bearerbox", $output, $return);
if ($return == 0) {
    echo "Ok, process is running\n";
}
5 голосов
/ 19 июня 2011

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

Что-то вроде:

exec('ps aux | grep bearerbox', $output);

Вам нужно решить, чтовозвращается на ваш сервер, чтобы решить, работает он или нет.

Удачи.

4 голосов
/ 19 июня 2011

Есть много способов справиться с этим. Самый простой (и прямой ответ на ваш вопрос) - получить вывод «ps».

Деймоны, как правило, всегда создают файл 'pid'. Этот файл содержит идентификатор процесса демона. Если у вас это есть, вы можете проверить содержимое файла и посмотреть, запущен ли еще процесс с этим идентификатором. Это более надежно.

supervisord также может иметь эту функцию. Наконец, может быть, лучше получить реальную систему мониторинга, чем создавать что-то самостоятельно. Нагиос может быть хорошим выбором, но могут быть и другие.

2 голосов
/ 28 ноября 2014

Простое, но удобное решение для мониторинга процессов через PHP: PHP-Linux-Process-Monitor .

Цели кода, такие как:

$ps = explode("\n", trim(shell_exec('ps axo pid,ppid,%cpu,pmem,user,group,args --sort %cpu')));
foreach($ps AS $process){
$processes[]=preg_split('@\s+@', trim($process), 7 );
}
$head= array_shift($processes);
$processes = array_reverse($processes);
$output='';
foreach ($head AS $f) $output.="<td class=\"head\">$f</td>";
$output=sprintf('<tr class="head">%s</tr>',$output);
foreach($processes AS $p){
    $output.='<tr>';
    foreach ($p AS $i=>$f){
        if($i==0) $output.=sprintf('<td>%1$s</td>',$f);
        elseif($i==2) $output.=sprintf('<td class="cpu">%1$s<ins style="width:%1$s%%"></ins></td>',$f);
        elseif($i==3) $output.=sprintf('<td class="mem">%1$s<ins style="width="%1$s%%"></ins></td>',$f);
        elseif($i == 6) $output.=sprintf('<td class="command">%1$s</td>',$f);
        else $output.=sprintf('<td>%1$s</td>',$f);
    }
    $output.='</tr>';
}
$cpu=implode('&nbsp;&nbsp;&nbsp;', sys_getloadavg());
$output=sprintf('<table data-cpu="%s" id="process">%s</table>',$cpu, $output);
0 голосов
/ 17 ноября 2017

Это лучший способ

<?php
exec("ps -eo comm,pid | awk '$1 == "."\"gs\""." { print $2 }'", $output);
if ($output != 0) {
    echo "The process gs is running\n";
}
?>

в приведенном выше коде gs - это процесс, который я проверял

...