最简方式是用ps和grep组合获取进程行数,再通过三元运算符输出标识:方法一为crontab中内联php执行,需单引号包裹整个命令防解析错误;方法二为封装独立php文件。

在Linux定时任务(crontab)中通过PHP脚本检查服务运行状态时,需要用最简方式判断进程是否存在并返回对应标识,三元运算符能将多行逻辑压缩成单行可读代码。
用ps和grep组合判断进程是否存活
执行 ps aux | grep 'php worker.php' | grep -v grep 获取匹配行数,再用三元运算符输出状态标识。
方法一:shell内联PHP执行
在crontab中直接写: * * * * * php -r "echo (trim(shell_exec('ps aux | grep \'php worker.php\' | grep -v grep | wc -l')) > 0) ? 'RUNNING' : 'STOPPED';" >> /var/log/worker_status.log 2>&1
这一步必须用 【单引号包裹整个php -r命令】,否则shell会提前解析$符号或反斜杠导致语法错误。
方法二:封装为独立PHP文件
新建 check_worker.php,内容为:<?php echo (intval(trim(shell_exec("ps aux | grep 'php worker.php' | grep -v grep | wc -l"))) > 0) ? 'RUNNING' : 'STOPPED';
然后在crontab中调用:* * * * * /usr/bin/php /path/to/check_worker.php >> /var/log/worker_status.log 2>&1
结合pgrep避免grep自身进程干扰
pgrep更精准,不会把grep命令本身算作匹配结果,适合生产环境稳定判断。
第一步:用pgrep查找进程PID
pgrep -f "php worker.php" 返回PID列表,无匹配时为空字符串。
第二步:在PHP中判断输出长度
php -r "$p=trim(shell_exec('pgrep -f "php worker.php"')); echo strlen($p) ? 'RUNNING' : 'STOPPED';"
注意这里双引号需转义,否则shell会截断命令;【必须用双引号包裹整个php -r参数,且内部双引号用反斜杠转义】,单引号无法解析变量$p。
用file_get_contents读取pid文件后校验进程
当服务已配置pid文件(如/var/run/worker.pid)时,优先验证该PID是否真实存在。
方法一:一行式校验
php -r "$pid=file_get_contents('/var/run/worker.pid'); echo (is_numeric($pid) && posix_kill((int)$pid, 0)) ? 'RUNNING' : 'STOPPED';"
posix_kill($pid, 0)仅检测进程是否存在,不发送信号,失败时会触发PHP警告;因此该写法要求error_reporting关闭或@抑制,否则日志混入Warning文本。
方法二:带容错的简洁写法
php -r "if (@file_get_contents('/var/run/worker.pid') as $pid) { echo (is_int($pid+0) && @posix_kill($pid+0, 0)) ? 'RUNNING' : 'STOPPED'; } else { echo 'STOPPED'; }"
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











