如何通过 PHP 检查我的 cronjob 是否在我的服务器上运行?

如何通过 PHP 检查我的 cronjob 是否在我的服务器上运行?

如果 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";
}
?>

相关内容