web-dev-qa-db-fra.com

Utilisation PHP créer, éditer et supprimer des travaux crontab?

Est-il possible d'utiliser PHP pour créer, éditer et supprimer des travaux crontab?

Je sais comment répertorier les travaux crontab actuels de l'utilisateur Apache:

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

Mais comment ajouter un travail cron avec PHP? 'crontab -e' ouvrirait simplement un éditeur de texte et vous devrez éditer manuellement les entrées avant de sauvegarder le fichier.

Et comment supprimer un travail cron avec PHP? Encore une fois, vous devez le faire manuellement avec 'crontab -e'.

Avec une chaîne de travail comme celle-ci:

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

Comment puis-je l'ajouter à la liste des tâches crontab avec PHP?

110
datasn.io

utilisation de la commande 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)

Alors,

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

Ce qui précède peut être utilisé pour créer et éditer/ajouter à condition que l’utilisateur dispose de l’autorisation suffisante pour l’écriture des fichiers.

Pour supprimer des travaux:

echo exec('crontab -r');

De plus, notez qu'Apache est exécuté en tant qu'utilisateur particulier et qu'il ne s'agit généralement pas d'un compte root. Cela signifie que les tâches cron ne peuvent être modifiées que pour l'utilisateur Apache, à moins que le privilège crontab -u ne soit accordé à l'utilisateur Apache.

127
ajreal

Nous avons récemment préparé un mini projet (PHP> = 5.3) pour gérer les fichiers cron des tâches privées et individuelles. Cet outil connecte et gère les fichiers cron afin que vous puissiez les utiliser, par exemple, par projet. Tests unitaires disponibles :-)

Exemple de ligne de commande:

bin/cronman --enable /var/www/myproject/.cronfile --user www-data

Exemple d'API:

use php\manager\crontab\CrontabManager;

$crontab = new CrontabManager();
$crontab->enableOrUpdate('/tmp/my/crontab.txt');
$crontab->save();

Gestion des tâches individuelles à partir de l'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

20
cardil

Vérifiez un 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;
}

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

Supprimer une crontab

exec('crontab -r', $crontab);

Exemple

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

Cela devrait le faire

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

J'ai essayé la solution ci-dessous

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

}

crédits à: Classe Crontab pour ajouter, modifier et supprimer des tâches cron

4
Sam T

Vous pouvez essayer de remplacer la variable d'environnement EDITOR par quelque chose comme ed qui peut prendre une séquence de commandes d'édition sur une entrée standard.

4
Alnitak

Agréable...
Essayez de supprimer un travail cron spécifique (testé).

<?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>
4
Ajie Kurniyawan

Dépend où vous stockez votre crontab:

Shell_exec('echo "'. $job .'" >> crontab');
3
thedom

Vous pouvez mettre votre fichier dans /etc/cron.d/ au format cron. Ajoutez un préfixe unique au nom de fichier Pour répertorier les travaux cron spécifiques au script, utilisez simplement une liste de fichiers avec un préfixe unique . Supprimez le fichier lorsque vous souhaitez désactiver le travail.

3
Dmitry Kireev

Le moyen le plus simple consiste à utiliser la commande Shell_exec pour exécuter un script bash, en transmettant les valeurs sous forme de paramètres. À partir de là, vous pouvez manipuler les crontabs comme vous le feriez dans tout autre script non interactif et vous assurer également que vous disposez des autorisations appropriées en utilisant Sudo, etc.

Voir ceci, Crontab sans crontab -e , pour plus d’informations.

0
Codemwnci

C'est simple, vous pouvez le faire, assurez-vous que curl est installé sur le serveur:

pour déclencher chaque minute: * * * * * curl --request POST ' https://glassdoor.com/admin/sendBdayNotification '

        • *

    minute heure jour mois semaine

Supposons que vous souhaitiez envoyer cette notification à 2:15 PM tous les jours Vous pouvez modifier le test POST/GET en fonction de votre API:

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

0
dinesh kandpal