如果我在命令行中键入crontab -l,我可以看到以下行:
# * * * * * /usr/bin/php /home/user/every_minute_script.php要启动这个cron作业,我需要使用crontab -e命令编辑文件,删除行首的注释字符,保存编辑的文件,然后退出编辑器。
若要停止,请执行相同的步骤,但在行的开头添加注释字符。
我希望使用PHP脚本实现完全相同的效果,而不是手动编辑文件。
发布于 2011-07-01 17:08:26
我做了一些研究和在论坛上找到的,以下信息:
调用"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)调用。稍后,我将调整它从网络运行,这是我的意图。
用法:./cron.php activate启用cronjob,./cron.php deactivate禁用它。
脚本正确地设置编辑器环境变量(自动设置),然后调用crontab -e,然后调用编辑器(现在是相同的cron.php脚本),将临时crontab文件位置作为参数传递。然后,找到并更改正确的crontab行,并保存修改后的版本,替换临时文件。当脚本退出时,crontab将更新。
这正是我想做的,也符合我的需要。
其他的答案都很好,可能适合不同的需求和场景,我想感谢每一个做出贡献的人。
发布于 2011-07-01 13:47:19
与其以编程方式搅乱crontab (这是微妙且快速的愤怒),我建议在您的every_minute_script.php中检查一下:
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然后包装器脚本正常运行,收集其输出和错误,如果这些不是空的,则将它们发送出去(请注意,您也可以在包装器脚本中进行检查;我们没有,因为它依赖于数据库)。
发布于 2011-07-01 13:46:51
下面是是一个非常酷的教程,用于使用PHP创建这种功能。
https://stackoverflow.com/questions/6548746
复制相似问题