如果我在命令行中键入crontab -l
,我可以看到以下行:
# * * * * * /usr/bin/php /home/user/every_minute_script.php
要启动此cronjob,我需要使用crontab -e
命令编辑文件,删除行开头的注释字符,保存编辑后的文件,然后退出编辑器。
停止此cronjob,步骤相同,但在行的开头添加注释字符。
我希望使用 PHP脚本实现完全相同的效果,而不是手动编辑文件。
答案 0 :(得分:12)
我做了一些研究和found in a forum,以下信息:
使用EDITOR调用“crontab -e” 环境变量设置为php 脚本。该脚本可以修改 文件和它退出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将更新。
这正是我想要的,也符合我的需要。
其他答案很好,可能适合不同的需求和场景,我要感谢所有贡献者。
答案 1 :(得分:7)
我建议在你的every_minute_script.php中进行检查,而不是以编程方式与crontab混淆(这是一种微妙而快速的愤怒):
if (!file_exists('/your/path/run_every_minute_script')) {
exit;
}
这样,脚本仍然会每分钟开始,但如果不满足条件(/your/path/run_every_minute_script
不存在),它将立即终止而无需进一步处理。
(当然,你可以在那里替换不同的条件,例如检查数据库的权限等。)
如果需要邮寄输出,可以使用包装器脚本。的crontab:
* * * * * /your/path/wrapper.sh > /dev/null 2> /dev/null
然后,包装器脚本正确运行该作业,收集其输出和错误,如果这些不是空的,则将它们发送出去(请注意,您也可以在包装器脚本中进行检查;我们没有,因为它依靠数据库)。
答案 2 :(得分:6)
Here's一个非常酷的教程,用于使用PHP创建这种功能。
答案 3 :(得分:2)
将您的停止/开始条件设置在every_minute_script.php
if($condition == false) {
exit();
}
答案 4 :(得分:2)
你可以在every_minute_script.php
的开头放置一些逻辑来检查一个标志,看它是否应该做什么?这样它就可以旋转,然后如果没有工作可以快速停止。
或者对你的目的来说效率太低了吗?