使用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,你也可以使用谷歌的应用程序引擎任务队列 。 它有一个慷慨的免费配额,是快速的,可扩展的,可修改的。