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

Проверьте, выполняется ли процесс с использованием PHP в Linux

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

4b9b3361

Ответ 1

Проще всего использовать pgrep, который имеет код выхода 0, если процесс существует, в противном случае.

Вот пример.

exec("pgrep bearerbox", $output, $return);
if ($return == 0) {
    echo "Ok, process is running\n";
}

Ответ 2

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

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

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

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

Удачи.

Ответ 3

Есть много способов справиться с этим. Самый простой (и прямой ответ на ваш вопрос) - это захват вывода "ps".

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

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

Ответ 4

Простое, но удобное решение для мониторинга процессов через 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('@\[email protected]', 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);

Ответ 5

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

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

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