使用PHP创build,编辑和删除crontab作业?

是否有可能使用PHP来创build,编辑和删除crontab作业?

我知道如何列出Apache用户的当前crontab作业:

$output = shell_exec('crontab -l'); echo $output; 

但是如何用PHP添加一个cron作业? 'crontab -e'只是打开一个文本编辑器,你必须在保存文件之前手动编辑条目。

以及如何删除与PHP的cron作业? 再次你必须手动做'crontab -e'。

用这样的工作string:

 $job = '0 */2 * * * /usr/bin/php5 /home/user1/work.php'; 

我如何将它添加到PHP的crontab作业列表?

crontab命令用法

 usage: crontab [-u user] file crontab [-u user] [ -e | -l | -r ] (default operation is replace, per 1003.2) -e (edit user's crontab) -l (list user's crontab) -r (delete user's crontab) -i (prompt before deleting user's crontab) 

所以,

 $output = shell_exec('crontab -l'); file_put_contents('/tmp/crontab.txt', $output.'* * * * * NEW_CRON'.PHP_EOL); echo exec('crontab /tmp/crontab.txt'); 

如果用户具有足够的文件写入权限,以上可用于创build和编辑/追加

删除作业:

 echo exec('crontab -r'); 

另外,请注意,apache作为特定用户运行,通常不是root,这意味着cron作业只能为apache用户更改,除非给予apache用户crontab -u特权。

我们最近准备了一个迷你项目(PHP> = 5.3)来pipe理用于私人和个人任务的cron文件。 这个工具连接和pipe理cron文件,所以你可以使用它们,例如每个项目。 unit testing可用:-)

来自命令行的示例:

 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(); 

从APIpipe理个别任务:

 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: php-crontab-manager

检查一个cronjob

 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; } 

追加一个cronjob

 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; } 

删除一个crontab

 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'); 

您可以尝试覆盖EDITOR环境variables,如ed ,它可以在标准input上执行一系列编辑命令。

这应该做到这一点

 shell_exec("crontab -l | { cat; echo '*/1 * * * * command'; } |crontab -"); 

取决于你存储你的crontab的地方:

 shell_exec('echo "'. $job .'" >> crontab'); 

尼斯…
试试这个删除特定的cron作业(testing)。

 <?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="eg: * * * * * /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="eg: * * * * * /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> 

我尝试了下面的解决scheme

 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; } } 

}

学分: Crontab类添加,编辑和删除Cron作业

你可以把你的文件以cron格式存放到/etc/cron.d/。 为filenaname添加一些独特的前缀要列出脚本特定的cron作业,只需使用具有唯一前缀的文件列表即可。 如果要禁用该作业,请删除该文件。

最简单的方法是使用shell_exec命令来执行一个bash脚本,将值作为参数传入。 从那里,你可以像在任何其他非交互式脚本中一样操作crontabs,并且通过使用sudo等来确保你拥有正确的权限。

看到这个, 没有crontab -e的Crontab ,获取更多信息。

而不是crontab,你也可以使用谷歌的应用程序引擎任务队列 。 它有一个慷慨的免费配额,是快速的,可扩展的,可修改的。