如果 cron 没有运行或者我的服务器上的 crontab 中没有设置某个 cronjob,我想发出警告。
可以用php检查吗?
答案1
您可以解析 的输出crontab -l
以查看特定的 crontab 条目是否存在。至于是否cron
正在运行,您可以解析命令的输出ps -eaf
来查看是否crond
正在运行。
$ ps -eaf|grep [c]rond
root 1705 1 0 May27 ? 00:00:03 crond
的输出crontab -l
将是这样的:
$ crontab -l
0 12 * * * ls
注意:您可以使用system()
功能在 PHP 中调用命令行工具或exec()
。
编辑#1
根据您的评论,您可以从 PHP 执行以下操作。我的脚本cronstatus.php
:
#!/usr/bin/php
<?php
exec("PATH=/usr/sbin:/usr/bin:/sbin:/bin; service crond status", $out, $ret);
print $ret . "\n";
?>
示例运行
$ sudo service crond stop
Stopping crond: [ OK ]
$ ./cronstatus.php
3
$ sudo service crond start
Starting crond: [ OK ]
$ ./cronstatus.php
0
该函数exec
可以将命令的输出返回到变量,$out
以及它在 中执行的命令返回的状态结果$ret
。
答案2
如果 PHP 可能可以读取 的内容,/etc/crontab
但通常不能读取 的内容,则/var/spool/cron/crontabs/
您必须解析这些行,主要是跳过注释掉的条目(这就是您所说的“在 crontab 中未设置某个 cronjob”的意思吗?)。
检查进程表中是否有“cron”条目应该是可能的,但弄清楚它是否真的在做某事可能更困难。
在我继承的一台旧的、有些不稳定的机器上,机器cron
有时会死机。我设置了一个每 15 分钟运行一次的任务,通知另一台更可靠的机器(通过电子邮件)。另一台机器将运行 cronjob 并检查电子邮件是否在 15 分钟前到达。如果不是,那份工作就会在我的寻呼机上向我发送通知。所以我只会在 cron 死掉时收到一条消息,而不是每 15 分钟收到一条消息。
如果您有第二台机器可以使用,您可以设置类似的东西。电子邮件消息可以包含任何 crontab 文件(甚至来自 )的内容/var/spool/cron/crontabs/
,并且可以检查是否仍然包含必要的命令。
答案3
一个更干净且可移植的解决方案将检查您由 cron 特别为此目的创建的文件的时间戳。
创建一个 cronjob,每分钟访问一个可由网络浏览器读取的文件,例如:
* * * * * www-data touch /var/www/cron-testfile
并使用 php 检查时间戳:
<?php
if(time() - filemtime('/var/www/cron-testfile') > 600) {
echo "warning, cron not running";
}
?>