Modifier un cron via PHP

#1
Bonjour,

L'outil cron du cPanel est bien pratique pour un administrateur. Maintenant comme j'ai des clients exigeants... ;-) ils voudraient pouvoir activer/desactiver un cron via leur interface web (javascript/php) voire pourvoir modifier la fréquence de leur cron. Depuis PHP, comment peut modifier le fichier de config contenant tous les crons (à vrai dire je ne sais même pas s'il existe ce fichier de config...) ?

merci d'avance
 
#2
Bonjour,
Tes clients sont hébergés de quelle façon ?

Je veux dire leur crées tu un compte grâce à un compte revendeur ou alors les heberges tu sur ton propre compte en domaine supplémentaire ?

La modification des cron s'effectue via le cPanel, d'où ma question ;-)
 
#3
Grand dieu non........ en fait oui mais la pirouette est sensible et très possible que l'action requise au niveau utilisateur soient désactivées ou non permises. (exec)

Vos clients seraient peut-être mieux avisés de laisser le cron tel qu'il est mais de jouer avec le script qu'il exécute. Par exemple, en faisant que le script utilise un fichier de configuration et que ce soit ce fichier qu'ils puissent modifier.

Exemple :
Fichier X = fichier exécuté par le cron
Fichier Y = paramètres ou config du fichier

Cron exécute le fichier X toutes les heures en lisant ses paramètres dans le fichier Y (qui pourrait contenir l'heure de la dernière exécution par exemple).

Si le client veut changer l'exécution pour qu'elle soit à toutes les deux heures (ou carrément la désactiver), modifier le fichier config.
 
#4
La solution de François est une très bonne alternative mais attention aux risques de boucles infinies sur des script mal codés... Ça s'est déjà vu :/
 
#5
Merci pour vos retours et notamment François qui a déjà pas mal oeuvré sur le sujet.

Je n'avais pas pensé à un super cron (script php) qui examine en entrée un fichier de config de tâches à activer ou non, même si au niveau du respect des fréquences (minutes, jour, mois, ...), je vois pas trop comment faire. Il faudrait en effet enregistrer un historique d'exécution de chaque tâche pour calculer le temps passé avant de la re-exécuter par rapport à sa fréquence.

Mes clients n'ont pas accès au cPanel bien entendu, c'est juste des clients via une appli web en mode SaaS.

Donc via PHP et wget, il n'est pas possible de supprimer un cron pour le remplacer par un autre même avec un user admin ? (des crons qu'on pourrait quand même voir et contrôler via l'outil du cPanel)
 
#6
Le Cron est un service serveur un peu comme un service Windows. Sans être vraiment calé en la matière, il me semble que pour prendre en compte les changements, le service doit être redémarré. Un pouvoir qu'il vaudrait mieux laisser à l'administrateur.

Par contre, PHP peut très bien lire l'heure du serveur et peut faire ce qu'il a à faire selon la configuration choisie. Si un CRON exécute un fichier PHP toutes les heures mais que le fichier PHP lui doit se faire toutes les deux heures.

Code:
if (((int)date("H") % 2) == 0) { // L'heure actuelle est un nombre pair. Donc, 12H, 2 h, 4 h, etc.... 
  echo "OPERATION A FAIRE";
}
 
#7
merci François, je prend cette direction, un seul cron qui dispatche des exécutions de tâches à fréquences différentes est bien plus fiable et sécurisé que de multiple crons en mode CRUD gérés par des utilisateurs (heureusement finalement que ce n'est pas possible techniquement...;-). De plus PHP dispose d'un grand nombre de fonctions de calcul sur le temps comme celle que vous m'avez donné, merci encore. Même en MySQL comme celle-ci:
SELECT ... WHERE TO_DAYS(now())-TO_DAYS(MAX(date_execution))-frequency = 0 (pour une frequence en nombre de jours)
 

PH-Quentin

Administrator
#8
Bonjour Marc-Marin,

Bonne nouvelle, il existe un système nommé cPanel API2 qui vous permet via un appel PHP de modifier vos CRON !

Il est avec ce moyen possible de faire les actions suivantes:

Cron:: add_line

Cron:: edit_line

Cron:: fetchcron

Cron:: get_email

Cron:: listcron

Cron:: remove_line

Cron:: set_email

Vous trouverez plus d'informations à ce sujet ici: https://documentation.cpanel.net/display/SDK/cPanel+API+2+Functions+-+Cron::add_line

Voici un petit bout de code qui expliquera comment cela fonctionne:

PHP:
$cpanel = new CPANEL(); // Connect to cPanel - only do this once.
// Add a crontab entry.
$dick_clark = $cpanel->api2(
    'Cron', 'add_line',
 array(
        'command'        => '/usr/bin/perl/home/username/happynewyear.pl',
        'day'            => '1',
        'hour'           => '0',
        'minute'         => '0',
        'month'          => '1',
        'weekday'        => '*',
    )
);
Bon weekend !
Quentin
 
#9
Bonjour Quentin

Voilà effectivement une bonne surprise qui va sans doute interesser pas mal d'administrateurs, car le push de données (alertes, indicateurs...) par email selon une fréquence choisie par les utilisateurs d'application métier est une forte demande.
 
Haut