Я использую kannel для отправки SMS через PHP. Я хочу знать, как проверить, работает ли какой-либо конкретный процесс. Для запуска канона процесс с именем bearerbox
должен выполняться все время. Я хочу проверить, работает ли этот процесс или нет. Поскольку, если процесс не запущен, мне будет отправлено письмо с уведомлением об этом.
Проверьте, выполняется ли процесс с использованием PHP в Linux
Ответ 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(' ', 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 - это процесс, который я проверял