我使用curl创建了一些cron作业:
curl -s https://ex.example.com/cron/test1.php
curl -s https://ex.example.com/cron/test2.php
curl -s https://ex.example.com/cron/test3.php
curl -s https://ex.example.com/cron/test4.php
现在我想使用PHP删除一个cron作业:
curl -s https://ex.example.com/cron/test3.php
我该怎么做呢?
答案 0 :(得分:0)
使用file_get_contents将文件转换为字符串,使用str_replace删除该行,并使用file_put_contents进行保存。像
<?php
$file="/path/to/jobs.sh";
$jobs=file_get_contents($file);
$jobs=str_replace('curl -s https://ex.example.com/cron/test3.php','',$jobs,$count);
if($count<1){
echo "failed to delete the job, couldn't find it!";
return 1;
}else{
file_put_contents($file,$str);
echo 'deleted '.$count.' jobs!';
}
preg_replace('/\s*'.preg_quote('curl -s https://ex.example.com/cron/test3.php','/').'\s*/',"\n",$jobs,$count);
- 这不会留下流浪新线,并将说明工作既不是开始也不是结束的可能性使用换行符,但在所有4个案例中删除换行符。 (案例1:它不是以换行符开头,并且它不以换行符结束,它是唯一的作业。案例2:它不是以换行符开头的,但结尾为1.案例3:它以换行符开头,但不以1结尾。案例4:以换行符开头,以换行符结束) - 如果你想用str_replace做这个,你不得不称它为4次! (并按照正确的顺序)答案 1 :(得分:0)
用户的crontab只是一个文本文件。当您运行crontab -e
时,/var/spool/cron/crontabs/
的crontab副本将复制到/tmp
,然后使用文本编辑器打开。保存后,如果进行了更改,则会将临时文件复制回crontabs目录以覆盖用户以前的crontab(如果存在)。
crontab
命令允许您列出内容,或启动它以进行手动编辑,但不特别允许您添加(尽管您已为其创建了包装)或从此文件中删除。我会编写一个包装器来为你做这个,它将需要两个命令行参数:
它看起来像这样:
<强> crontab.php 强>
$cron = '/var/spool/cron/crontabs/' . `echo $USER`;
$action = $argv[1];
$line = array_slice( $argv, 2 );
if ( $action == 'add' ) {
file_put_contents( $cron, $line . "\n", FILE_APPEND );
} elseif ( $action == 'del' ) {
$file = explode( "\n", file_get_contents( $cron ));
unlink( $cron );
foreach ( $file as $file_line ) {
if ( trim( $file_line ) != trim( $line )) {
file_put_contents( $cron, $file_line . "\n", FILE_APPEND );
}
}
}
您可以像这样运行:
./crontab.php add * * * * curl -s https://ex.example.com/cron/test3.php
这会添加一行:
* * * * curl -s https://ex.example.com/cron/test3.php
...到用户的crontab的末尾。以下内容:
./crontab.php add * * * * curl -s https://ex.example.com/cron/test3.php
...将用于删除该行,无论它在文件中的哪个位置。
请注意,上面的脚本只是一个让您从一个方向开始的示例。它缺少一些东西,即错误检查: