如何使用PHP启动/停止cronjob?

J. *_*uni 12 php linux cron crontab

如果我输入crontab -l命令行,我可以看到以下行:

# * * * * * /usr/bin/php /home/user/every_minute_script.php
Run Code Online (Sandbox Code Playgroud)

启动此cronjob,我需要使用crontab -e命令编辑文件,删除行开头的注释字符,保存编辑的文件,然后退出编辑器.

停止此cronjob,请执行相同的步骤,但在行的开头添加注释字符.

我想使用PHP脚本实现完全相同的效果,而不是手动编辑文件.

J. *_*uni 12

我做了一些研究并在论坛中发现了以下消息:

使用设置为php脚本的EDITOR环境变量调用"crontab -e".该脚本可以修改该文件,当它退出crontab时将重新读取该文件并进行更新.

所以,我尝试了一些东西,它起作用了.我将粘贴下面的工作代码:

#!/usr/bin/php
<?php

$on  = "* * * * * /usr/bin/php /home/user/every_minute_script.php\n";
$off = "# * * * * * /usr/bin/php /home/user/every_minute_script.php\n";

$param    = isset( $argv[1] ) ? $argv[1] : '';
$filename = isset( $argv[2] ) ? $argv[2] : '';

if ( $param == 'activate' )
{
    shell_exec( 'export EDITOR="/home/user/cron.php on"; crontab -e' );
}
elseif( $param == 'deactivate' )
{
    shell_exec( 'export EDITOR="/home/user/cron.php off"; crontab -e' );
}
elseif( in_array( $param, array( 'on', 'off' ) ) )
{
    if ( !is_writable( $filename ) )
        exit();

    $crontab = file( $filename );
    $key = array_search( $param == 'on' ? $off : $on, $crontab );

    if ( $key === false )
        exit();

    $crontab[$key] = $param == 'on' ? $on : $off;
    sleep( 1 );
    file_put_contents( $filename, implode( '', $crontab ) );
}

exit();

?>
Run Code Online (Sandbox Code Playgroud)

实际上,我们有一个命名cron.php位于/home/user文件夹的脚本,设置为executable(chmod a+x cron.php)并从命令行(PHP-CLI)调用.稍后我会调整它从网上运行,这是我的意图.

用法:./cron.php activate启用cronjob并./cron.php deactivate禁用它.

该脚本正确设置EDITOR环境变量(自身),然后调用crontab -e,然后调用EDITOR(现在是相同的cron.php脚本)将临时crontab文件位置作为参数传递.然后,找到并更改正确的crontab行,并保存修改后的版本,替换临时文件.当脚本退出时,crontab将更新.

这完全符合我的要求,符合我的需求.

其他答案很好,可能适合不同的需求和场景,我要感谢所有贡献者.


Pis*_*3.0 7

我建议在你的every_minute_script.php中进行检查,而不是以编程方式使用crontab(这是一种微妙而快速的愤怒).

if (!file_exists('/your/path/run_every_minute_script')) {
  exit;
}
Run Code Online (Sandbox Code Playgroud)

这样,脚本仍然会每分钟开始,但如果条件不满足(/your/path/run_every_minute_script不存在),它将立即终止而无需进一步处理.

(当然,您可以在那里替换不同的条件,例如检查数据库是否允许等)


如果需要邮寄输出,可以使用包装器脚本.crontab的:

* * * * * /your/path/wrapper.sh > /dev/null 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

然后,包装器脚本正确运行该作业,收集其输出和错误,如果这些不是空的,则将它们邮寄出去(请注意,您也可以在包装器脚本中进行检查;我们没有,因为它依赖于数据库).


Uku*_*kit 6

这是一个非常酷的教程,用于使用PHP创建这种功能.