Forum général.général Crontab

Posté par  .
Étiquettes : aucune
0
9
mar.
2005

Salut a tous,

J'aurai aimé savoir comment lancer tout les jours a la même heure un script en tant que l'utilisateur de apache (nobody) mais en faisant en sorte que si ce programme est déjà lancé le script ne s'execute pas !

Auriez-vous une idée de comment faire ?!

Merci d'avance

cordialement,

  • # Méthode sauvage

    Posté par  . Évalué à 4.

    Il doit bien y avoir une méthode propre avec un lock de fichier, mais ce que je peux te proposer, c'est que le programme fasse ça :
    1) vérifier que le fichier mon_script.lock n'existe pas ; s'il existe, on se tire
    2) créer le fichier mon_script.lock si on ne s'est pas tiré
    3) traitements
    4) effacer le fichier mon_script.lock

    Attention à bien effacer le fichier quand tu sors, y compris lors de sorties anormales (genre si un traitement foire, il faut que ton fichier s'efface, sinon le traitement ne se lancera plus).
    • [^] # Re: Méthode sauvage

      Posté par  . Évalué à 5.

      D'où l'intérêt des fichiers qu'on trouve parfois dans /var/lock qui contiennent le PID du processus.

      Du coup, si tu as fait un kill sauvage, et que tu relances ton programme, il arrive en 1
      vérifie le fichier, son contenu, et si le PID correspond bien à ce que tu veux.

      Et voilà, c'est la fête.

      Et ça évite d'utiliser un ps. Si d'autres processus doivent être renseignés de l'état de ton programme, ils peuvent savoir si il est ou non lancé facilement.
  • # simple hein ?

    Posté par  (site web personnel) . Évalué à 2.

    Bon là je te donne juste la théorie, je peux pas tester pour voir si ca marche mais en gros:

    tu édites le crontab de l'utilisateur nobody (en root, crontab -u nobody -e) et tu places le cron que tu veux lancer quotidiennement :

    pour le lancer à 3h par exemple
    0 3 * * * /chemin/vers/ton/script

    et bien sur ton script en question ne se contente pas de lancer la commande qui va bien mais vérifie avant tout si cette meme commande n'est pas deja lancée...

    un peu comme ca :


    isrunning=`ps aux|grep commande_a_lancer|wc -l`
    if [ $isrunning == "0" ]
    then
    commande_a_lancer
    fi;


    bon c'est pas testé, c'est gruiiiik mais c'est l'idée
    • [^] # Re: simple hein ?

      Posté par  . Évalué à 4.

      Et si tu n'as pas envie d'aller aux toilettes, ton script peut ressembler à ça :

      #! /bin/sh
      if ! ps --no-headers -C commande_a_lancer > /dev/null;
      then commande_a_lancer;
      fi;
      • [^] # Re: simple hein ?

        Posté par  . Évalué à 4.

        ... d'autant plus que le ps | grep retournera toujours une ligne correspondant à son ps .... (pitié, ne me sortez pas le | grep -v ps, il y a d'autres méthodes plus élégantes ...).
      • [^] # Re: simple hein ?

        Posté par  . Évalué à 2.

        La solution propre consiste à utiliser killall (ou pkill) avec le signal zéro, pour détecter si le processus existe ou non.

        Voir le man de kill pour plus de détails.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.