Можно ли использовать PHP для создания, редактирования и удаления заданий crontab?
Я знаю, как перечислять текущие задания crontab для пользователя Apache:
$output = shell_exec('crontab -l'); echo $output;
Но как добавить работу cron с PHP? «crontab -e» просто откроет текстовый редактор, и вам придется вручную отредактировать записи перед сохранением файла.
И как удалить работу cron с PHP? Снова вам нужно вручную сделать это с помощью «crontab -e».
С заданной строкой:
$job = '0 */2 * * * /usr/bin/php5 /home/user1/work.php';
Как добавить его в список заданий crontab с помощью PHP?
Использование команды 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');
Вышеприведенное может использоваться как для создания, так и для редактирования / добавления, если у пользователя есть достаточное разрешение на запись файла.
Чтобы удалить задания:
echo exec('crontab -r');
Также обратите внимание, что apache работает как конкретный пользователь, и обычно это не root, что означает, что задания cron могут быть изменены только для пользователя apache, если не предоставляется привилегия crontab -u
для пользователя apache.
Недавно мы подготовили мини-проект (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();
Управление отдельными задачами из API:
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
окружения EDITOR
чем-то вроде ed
который может принимать последовательность команд редактирования через стандартный ввод.
Это должно сделать это
shell_exec("crontab -l | { cat; echo '*/1 * * * * command'; } |crontab -");
Зависит от того, где вы храните свой кронтаб:
shell_exec('echo "'. $job .'" >> crontab');
Ницца…
Попробуйте удалить конкретное задание 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="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>
Я попробовал решение ниже
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; } }
с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 Class для добавления, редактирования и удаления заданий Cron
Вы можете поместить свой файл в /etc/cron.d/ в формате cron. Добавьте некоторый уникальный префикс в filenaname. Чтобы просмотреть задания cron для скрипта, просто работайте со списком файлов с уникальным префиксом. Удалите файл, если вы хотите отключить задание.
Самый простой способ – использовать команду shell_exec для выполнения сценария bash, передавая значения в качестве параметров. Оттуда вы можете манипулировать crontabs, как и в любом другом неинтерактивном скрипте, а также убедиться, что у вас есть правильные разрешения, используя sudo и т. Д.
См. Это, Crontab без crontab -e , для получения дополнительной информации.
Вместо crontab вы также можете использовать очередь задач с движком Google. У этого есть щедрая свободная квота, быстрая, масштабируемая, изменяемая.