一尘不染

检查进程是否仍在运行?

php

作为构建穷人看门狗并确保应用程序崩溃的一种方法(直到我弄清原因),我需要编写一个PHP
CLI脚本,该脚本将由cron每5百万次运行一次,以检查该进程仍在运行。

基于此页面,我尝试了以下代码,但是即使我使用虚假数据对其进行调用,它也始终返回True:

function processExists($file = false) {
    $exists= false;
    $file= $file ? $file : __FILE__;

    // Check if file is in process list
    exec("ps -C $file -o pid=", $pids);
    if (count($pids) > 1) {
    $exists = true;
    }
    return $exists;
}

#if(processExists("lighttpd"))
if(processExists("dummy"))
    print("Exists\n")
else
    print("Doesn't exist\n");

接下来,我尝试了这段代码 …

(exec("ps -A | grep -i 'lighttpd -D' | grep -v grep", $output);)
print $output;

…但是没有达到我的期望:

/tmp> ./mycron.phpcli 
Arrayroot:/tmp>

FWIW,此脚本与PHP 5.2.5的CLI版本一起运行,并且操作系统为uClinux 2.6.19.3。

谢谢您的提示。


编辑:这似乎工作正常

exec("ps aux | grep -i 'lighttpd -D' | grep -v grep", $pids);
if(empty($pids)) {
        print "Lighttpd not running!\n";
} else {
        print "Lighttpd OK\n";
}

阅读 251

收藏
2020-05-29

共1个答案

一尘不染

[pgrep](http://en.wikipedia.org/wiki/Pgrep)会这样做(注意,未经测试的代码):

exec("pgrep lighttpd", $pids);
if(empty($pids)) {

    // lighttpd is not running!
}

我有一个执行类似操作的bash脚本(但使用SSH隧道):

#!/bin/sh

MYSQL_TUNNEL="ssh -f -N -L 33060:127.0.0.1:3306 tunnel@db"
RSYNC_TUNNEL="ssh -f -N -L 8730:127.0.0.1:873 tunnel@db"

# MYSQL
if [ -z `pgrep -f -x "$MYSQL_TUNNEL"` ] 
then
    echo Creating tunnel for MySQL.
    $MYSQL_TUNNEL
fi

# RSYNC
if [ -z `pgrep -f -x "$RSYNC_TUNNEL"` ]
then
    echo Creating tunnel for rsync.
    $RSYNC_TUNNEL
fi

您可以使用要监视的命令来更改此脚本。

2020-05-29