使用PHP创建、编辑和删除crontab作业?
是否可以使用PHP创建、编辑和删除crontab作业 我知道如何列出Apache用户当前的crontab作业:使用PHP创建、编辑和删除crontab作业?,php,crontab,Php,Crontab,是否可以使用PHP创建、编辑和删除crontab作业 我知道如何列出Apache用户当前的crontab作业: $output = shell_exec('crontab -l'); echo $output; 但是如何用PHP添加cron作业?”crontab-e'只需打开一个文本编辑器,您必须在保存文件之前手动编辑条目 以及如何使用PHP删除cron作业?同样,您必须通过“crontab-e”手动执行此操作 使用如下作业字符串: $job = '0 */2 * * * /usr/bin/p
$output = shell_exec('crontab -l');
echo $output;
但是如何用PHP添加cron作业?”crontab-e'只需打开一个文本编辑器,您必须在保存文件之前手动编辑条目
以及如何使用PHP删除cron作业?同样,您必须通过“crontab-e”手动执行此操作
使用如下作业字符串:
$job = '0 */2 * * * /usr/bin/php5 /home/user1/work.php';
如何使用PHP将其添加到crontab作业列表?最简单的方法是使用shell_exec命令执行bash脚本,并将值作为参数传入。从那里,您可以像在任何其他非交互式脚本中一样操作crontab,还可以使用sudo等确保您拥有正确的权限
有关更多信息,请参见此部分。您可以尝试使用类似ed的内容覆盖编辑器环境变量,它可以在标准输入上执行一系列编辑命令。取决于您存储crontab的位置:
shell_exec('echo "'. $job .'" >> crontab');
除了crontab,你还可以使用谷歌的应用引擎。它有一个慷慨的免费配额,快速、可扩展、可修改。crontab命令用法 所以 如果用户具有足够的文件写入权限,则上述内容可用于创建和编辑/追加 要删除作业,请执行以下操作:
另外,请注意,apache是以特定用户的身份运行的,并且通常不是root用户,这意味着只有在向apache用户授予crontab-u权限的情况下,才能为apache用户更改cron作业。您可以将文件以cron格式放入/etc/cron.d/。向filenaname添加一些唯一的前缀 要列出特定于脚本的cron作业,只需使用具有唯一前缀的文件列表。
如果要禁用作业,请删除该文件。我们最近准备了一个小型项目PHP>=5.3,用于管理用于私人和单个任务的cron文件。此工具连接并管理cron文件,以便您可以使用它们,例如每个项目。可用的单元测试:- 来自命令行的示例:
bin/cronman --enable /var/www/myproject/.cronfile --user www-data
API样本:
use php\manager\crontab\CrontabManager;
$crontab = new CrontabManager();
$crontab->enableOrUpdate('/tmp/my/crontab.txt');
$crontab->save();
use php\manager\crontab\CrontabManager;
$crontab = new CrontabManager();
$job = $crontab->newJob();
$job->on('* * * * *');
$job->onMinute('20-30')->doJob("echo foo");
$crontab->add($job);
$job->onMinute('35-40')->doJob("echo bar");
$crontab->add($job);
$crontab->save();
从API管理单个任务:
use php\manager\crontab\CrontabManager;
$crontab = new CrontabManager();
$crontab->enableOrUpdate('/tmp/my/crontab.txt');
$crontab->save();
use php\manager\crontab\CrontabManager;
$crontab = new CrontabManager();
$job = $crontab->newJob();
$job->on('* * * * *');
$job->onMinute('20-30')->doJob("echo foo");
$crontab->add($job);
$job->onMinute('35-40')->doJob("echo bar");
$crontab->add($job);
$crontab->save();
github:这应该可以
shell_exec("crontab -l | { cat; echo '*/1 * * * * command'; } |crontab -");
很好。。。
尝试此操作以删除已测试的特定cron作业
检查工作
附加cronjob
删除crontab
范例
我尝试了下面的解决方案
class Crontab {
// In this class, array instead of string would be the standard input / output format.
// Legacy way to add a job:
// $output = shell_exec('(crontab -l; echo "'.$job.'") | crontab -');
static private function stringToArray($jobs = '') {
$array = explode("\r\n", trim($jobs)); // trim() gets rid of the last \r\n
foreach ($array as $key => $item) {
if ($item == '') {
unset($array[$key]);
}
}
return $array;
}
static private function arrayToString($jobs = array()) {
$string = implode("\r\n", $jobs);
return $string;
}
static public function getJobs() {
$output = shell_exec('crontab -l');
return self::stringToArray($output);
}
static public function saveJobs($jobs = array()) {
$output = shell_exec('echo "'.self::arrayToString($jobs).'" | crontab -');
return $output;
}
static public function doesJobExist($job = '') {
$jobs = self::getJobs();
if (in_array($job, $jobs)) {
return true;
} else {
return false;
}
}
static public function addJob($job = '') {
if (self::doesJobExist($job)) {
return false;
} else {
$jobs = self::getJobs();
$jobs[] = $job;
return self::saveJobs($jobs);
}
}
static public function removeJob($job = '') {
if (self::doesJobExist($job)) {
$jobs = self::getJobs();
unset($jobs[array_search($job, $jobs)]);
return self::saveJobs($jobs);
} else {
return false;
}
}
}
归功于:很简单,您可以使用curl来执行此操作,请确保服务器上安装了curl: 每分钟触发一次: *****卷曲-请求张贴 * 分时日月周 假设您希望每天下午2:15发送此通知 您可以根据API更改POST/GET:
15 14***curl-请求发布“ur API的url”可能与crontab重复,并提示crontab只是一个file@Gordon谢谢我知道所有内容都是一个文件,但它们是否在不同发行版的同一路径上存储crontab作业?此外,它还需要获得Apache的用户(如www数据)并具有root权限?我不确定路径是否会在发行版之间发生变化,但您可以在代码中将路径设置为可配置值,然后在运行时进行设置。关于用户和权限:每个用户都可以有一个crontab,该crontab运行分配给该用户的权限的作业,因此这对于您的系统设置是单独的。另请参见“crontab-r”是否会删除该用户的所有作业?是否有任何方法可以删除用户crontab中的特定作业行?加载、搜索然后删除找到的行似乎是唯一的方法。您可以使用管道而不是编写临时fileNice解决方案,但是shell_exec'crontab-l'将只返回最后一行。我使用了exec'crontab-l',$output。然后将$output数组内爆为一个字符串,\n作为粘合剂。@Rahul如果服务器提供程序没有提供诸如system、PASSTRU、shell_exec和exec之类的shell命令,请尝试使用主机附带的控制面板,如cPanel或Plesk。这样每次都会在文件中追加相同的作业。检查是否有办法先删除匹配的作业,然后再编写新作业?很好。这肯定会派上用场的。。。假设它真的有效:@Pacerier这个项目似乎已经死了,并且有一些问题。尝试哪个更活跃。记住添加退出;在标题“位置:…”之后;。另外,这个表单实际上相当危险,因为它可以添加cron作业来破坏服务器。一个在PHP开头,一个在结尾就足够了。函数append\u cronjob对我不起作用。我得到的输出'-'不存在:数组[0]=>'-'不存在。[1] =>用法:crontab文件[2]=>crontab[-e |-l |-r][3]=>-e编辑用户的crontab[4]=>-l列出用户的crontab[5]=>-r删除用户的crontab执行命令'echo-e crontab-l\n'。.| crontab-',$output;对吗。我没有收到www数据的crontab-:0:crontab文件中存在错误分钟,
无法安装。Crontab使用换行符和换行符分隔作业。每个作业占用一行。因此,如果crontab在一行的第一列中看到除整数以外的任何内容,它将抛出“bad minute”错误,因为minute参数是crontab遇到的第一个参数。看看这个谢谢。。。如何在您的项目中使用cron_TZ?为什么不简单地使用cronjob?有些人可能在共享主机中,因此这可能根本不起作用。我更喜欢此解决方案,因为它避免了对整个cron文件的操作,并且易于删除,而不必在大型cron文件上添加和删除特定的cron任务。
<?php $output = shell_exec('crontab -l'); ?>
<?php $cron_file = "/tmp/crontab.txt"; ?>
<!-- Execute script when form is submitted -->
<?php if(isset($_POST['add_cron'])) { ?>
<!-- Add new cron job -->
<?php if(!empty($_POST['add_cron'])) { ?>
<?php file_put_contents($cron_file, $output.$_POST['add_cron'].PHP_EOL); ?>
<?php } ?>
<!-- Remove cron job -->
<?php if(!empty($_POST['remove_cron'])) { ?>
<?php $remove_cron = str_replace($_POST['remove_cron']."\n", "", $output); ?>
<?php file_put_contents($cron_file, $remove_cron.PHP_EOL); ?>
<?php } ?>
<!-- Remove all cron jobs -->
<?php if(isset($_POST['remove_all_cron'])) { ?>
<?php echo exec("crontab -r"); ?>
<?php } else { ?>
<?php echo exec("crontab $cron_file"); ?>
<?php } ?>
<!-- Reload page to get updated cron jobs -->
<?php $uri = $_SERVER['REQUEST_URI']; ?>
<?php header("Location: $uri"); ?>
<?php exit; ?>
<?php } ?>
<b>Current Cron Jobs:</b><br>
<?php echo nl2br($output); ?>
<h2>Add or Remove Cron Job</h2>
<form method="post" action="<?php $_SERVER['REQUEST_URI']; ?>">
<b>Add New Cron Job:</b><br>
<input type="text" name="add_cron" size="100" placeholder="e.g.: * * * * * /usr/local/bin/php -q /home/username/public_html/my_cron.php"><br>
<b>Remove Cron Job:</b><br>
<input type="text" name="remove_cron" size="100" placeholder="e.g.: * * * * * /usr/local/bin/php -q /home/username/public_html/my_cron.php"><br>
<input type="checkbox" name="remove_all_cron" value="1"> Remove all cron jobs?<br>
<input type="submit"><br>
</form>
function cronjob_exists($command){
$cronjob_exists=false;
exec('crontab -l', $crontab);
if(isset($crontab)&&is_array($crontab)){
$crontab = array_flip($crontab);
if(isset($crontab[$command])){
$cronjob_exists=true;
}
}
return $cronjob_exists;
}
function append_cronjob($command){
if(is_string($command)&&!empty($command)&&cronjob_exists($command)===FALSE){
//add job to crontab
exec('echo -e "`crontab -l`\n'.$command.'" | crontab -', $output);
}
return $output;
}
exec('crontab -r', $crontab);
exec('crontab -r', $crontab);
append_cronjob('* * * * * curl -s http://localhost/cron/test1.php');
append_cronjob('* * * * * curl -s http://localhost/cron/test2.php');
append_cronjob('* * * * * curl -s http://localhost/cron/test3.php');
class Crontab {
// In this class, array instead of string would be the standard input / output format.
// Legacy way to add a job:
// $output = shell_exec('(crontab -l; echo "'.$job.'") | crontab -');
static private function stringToArray($jobs = '') {
$array = explode("\r\n", trim($jobs)); // trim() gets rid of the last \r\n
foreach ($array as $key => $item) {
if ($item == '') {
unset($array[$key]);
}
}
return $array;
}
static private function arrayToString($jobs = array()) {
$string = implode("\r\n", $jobs);
return $string;
}
static public function getJobs() {
$output = shell_exec('crontab -l');
return self::stringToArray($output);
}
static public function saveJobs($jobs = array()) {
$output = shell_exec('echo "'.self::arrayToString($jobs).'" | crontab -');
return $output;
}
static public function doesJobExist($job = '') {
$jobs = self::getJobs();
if (in_array($job, $jobs)) {
return true;
} else {
return false;
}
}
static public function addJob($job = '') {
if (self::doesJobExist($job)) {
return false;
} else {
$jobs = self::getJobs();
$jobs[] = $job;
return self::saveJobs($jobs);
}
}
static public function removeJob($job = '') {
if (self::doesJobExist($job)) {
$jobs = self::getJobs();
unset($jobs[array_search($job, $jobs)]);
return self::saveJobs($jobs);
} else {
return false;
}
}