Modifier un cron via PHP

Discussion dans 'Discussions Générales' démarrée par MarcMarin, Mar 7, 2017.

  1. MarcMarin

    MarcMarin Member

    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. David77

    David77 Member

    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. François D

    François D Member

    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. David77

    David77 Member

    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. MarcMarin

    MarcMarin Member

    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. François D

    François D Member

    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. MarcMarin

    MarcMarin Member

    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)
     
  8. PH-Quentin

    PH-Quentin Administrator Membre de l'équipe

    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
     
    David77 aime votre message.
  9. MarcMarin

    MarcMarin Member

    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.
     

Partager cette page