一尘不染

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

linux

如果我crontab -l在命令行中键入,则可以看到以下行:

# * * * * * /usr/bin/php /home/user/every_minute_script.php

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

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

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


阅读 328

收藏
2020-06-07

共1个答案

一尘不染

我进行了一些研究,并在论坛中找到以下消息:

将EDITOR环境变量设置为php脚本,调用“ 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();

?>

实际上,我们cron.php/home/user文件夹中有一个名为的脚本,设置为可执行文件(chmod a+x cron.php),并从命令行(PHP-CLI)调用。稍后,我将对其进行调整以从网络运行,这是我的意图。

用法:./cron.php activate启用cronjob并将./cron.php deactivate其禁用。

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

这恰好满足了我的需求,并且符合我的需求。

其他答案很好,可能适合不同的需求和方案,在此我要感谢做出贡献的每个人。

2020-06-07