Использовать PHP для создания, редактирования и удаления заданий crontab?

Можно ли использовать 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?

Ответ 1

Использование команды crontab

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

Итак,

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

Вышеупомянутые могут использоваться как для create, так и для редактирования/добавления, если у пользователя есть достаточное разрешение на запись файла.

Чтобы удалить задания:

echo exec('crontab -r');

Также обратите внимание, что apache работает как конкретный пользователь и обычно не является root, что означает, что задания cron могут быть изменены только для пользователя apache, если не предоставляется привилегия crontab -u для пользователя apache.

Ответ 2

Недавно мы подготовили мини-проект (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

Ответ 3

Проверить 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');

Ответ 4

Вы можете попробовать переопределить переменную среды EDITOR с чем-то вроде ed, которая может принимать последовательность команд редактирования через стандартный ввод.

Ответ 5

Это должно сделать это

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

Ответ 6

Ницца...
Попробуйте удалить конкретное задание 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>

Ответ 7

Зависит от того, где вы храните свой crontab:

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

Ответ 8

Вы можете поместить свой файл в/etc/cron.d/в формате cron. Добавить уникальный префикс в filenaname Список script -специфических заданий cron просто работает со списком файлов с уникальным префиксом. Удалите файл, если вы хотите отключить задание.

Ответ 9

Я попробовал решение ниже

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

Ответ 10

Самый простой способ - использовать команду shell_exec для выполнения bash script, передавая значения в качестве параметров. Оттуда вы можете манипулировать crontabs, как в любом другом неинтерактивном script, а также убедиться, что у вас есть правильные разрешения с помощью sudo и т.д.

Смотрите, Crontab без crontab -e, для получения дополнительной информации.

Ответ 11

Его простое Вы можете закручиваться, чтобы сделать это, убедитесь, что завиток установлен на сервере:

для запуска каждую минуту: * * * * * curl --request POST ' https://glassdoor.com/admin/sendBdayNotification '

        • *

    минут час день месяц неделя

Скажем, вы хотите отправить это уведомление 2:15 вечера каждый день. Вы можете изменить POST/GET на основе вашего API:

15 14 * * * curl --request POST 'url of ur API'

Ответ 12

Вместо crontab вы также можете использовать google app engine очередь задач. Он имеет щедрую свободную квоту, быструю, масштабируемую, модифицируемую.