117 votes

Utiliser PHP pour créer, modifier et supprimer des tâches crontab ?

Est-il possible d'utiliser PHP pour créer, modifier et supprimer des tâches crontab ?

Je sais comment dresser la liste des tâches crontab actuelles de l'utilisateur Apache :

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

Mais comment ajouter une tâche cron avec PHP ? La commande 'crontab -e' ouvre simplement un éditeur de texte et vous devez modifier manuellement les entrées avant de sauvegarder le fichier.

Et comment supprimer une tâche 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 l'ajouter à la liste des tâches de la crontab avec PHP ?

2 votes

Duplication possible de Tâches cron avec php et un quelques autres

14 votes

(indice) la crontab est juste un fichier

1 votes

@Gordon, merci. Je sais que tout est un fichier, mais stockent-ils les tâches crontab au même endroit dans les différentes distributions ? De plus, il faudrait qu'il obtienne l'utilisateur d'Apache, tel que www-data, et qu'il ait les privilèges de Root ?

136voto

ajreal Points 31456

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)

Donc,

$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é à la fois pour créer et modifier/appliquer à condition que l'utilisateur dispose des droits d'écriture adéquats.

Pour supprimer des travaux :

echo exec('crontab -r');

Notez également qu'apache fonctionne sous un utilisateur particulier et que ce n'est généralement pas Root, ce qui signifie que les tâches cron ne peuvent être modifiées que pour l'utilisateur apache, à moins qu'il ne soit indiqué crontab -u à l'utilisateur apache.

4 votes

Est-ce que 'crontab -r' ne supprimerait pas tous les travaux de l'utilisateur ? Existe-t-il un moyen de supprimer une ligne spécifique de travail dans les crontabs de l'utilisateur ? Le chargement, la recherche puis la suppression de la ligne trouvée semblent être la seule solution.

3 votes

Vous pouvez utiliser des pipes au lieu d'écrire un fichier temporaire

7 votes

Bonne solution mais shell_exec('crontab -l') ne retournera que la dernière ligne. J'ai utilisé exec('crontab -l', $output) . Ensuite, implosez le tableau $output en une chaîne de caractères (avec \n comme colle).

20voto

cardil Points 404

Nous avons récemment préparé un mini projet (PHP>=5.3) pour gérer les fichiers cron pour les 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 en ligne de commande :

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

Exemple de l'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

0 votes

Joli. Cela va certainement être utile... en supposant que cela fonctionne vraiment :)

0 votes

@Pacerier ce projet semble mort et a quelques problèmes. Essayez yzalis/crontab qui est plus actif.

10voto

RafaSashi Points 1492

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

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

0 votes

La fonction append_cronjob ne fonctionne pas pour moi. J'obtiens le résultat suivant : '-' n'existe pas : Array ( [0] => '-' n'existe pas. [1] => utilisation : fichier crontab [2] => crontab [ -e | -l | -r ] [3] => -e (éditer la crontab de l'utilisateur) [4] => -l (lister la crontab de l'utilisateur) [5] => -r (supprimer la crontab de l'utilisateur) )

0 votes

Exec('echo -e " crontab -l \n '.$command.'" | crontab -', $output) ; est-ce correct. Je ne reçois pas de crontab pour www-data "-":0 : bad minute errors in crontab file, can't install.

0 votes

Crontab délimite les tâches avec des sauts de ligne (newlines). Chaque travail occupe une ligne. Par conséquent, si crontab voit autre chose qu'un nombre entier dans la première colonne d'une ligne, il lance l'erreur "bad minute", puisque l'argument minute est le premier que crontab rencontre. vérifiez ceci dougv.com/2006/12/

5voto

Rega Points 261

Oui, vous pouvez gérer les tâches crontab avec PHP. Voici un très bon tutoriel à ce sujet

http://net.tutsplus.com/tutorials/php/managing-cron-jobs-with-php-2/

4voto

Alnitak Points 143355

Vous pouvez essayer de remplacer l'option EDITOR avec quelque chose comme ed qui peut prendre une séquence de commandes d'édition sur l'entrée standard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X