IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Lancer un traitement toutes les minutes


Sujet :

Shell et commandes GNU

  1. #1
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 103
    Points : 224
    Points
    224
    Par défaut Lancer un traitement toutes les minutes
    Bonjour à tous,

    J'écris un script en Shell où se trouve une fonction traitement() devant être relancée toutes les minutes. Ma première idée fut la suivante :

    Code shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while [1]
    do
      sleep(60)
      traitement()
    done

    Mais malheureusement, le traitement() peut prendre du temps et le délai d'une minute entre chaque lancement ne serait plus respecté. Avez-vous une idée sur ce problème s'il vous plaît ? Dois-je lancer traitement dans un thread séparé ou existe-t-il des solutions moins lourdes ?

    Merci pour vos réponses !

  2. #2
    Membre chevronné

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 576
    Points : 1 989
    Points
    1 989
    Par défaut
    Bonjour, un chrontab qui lance ton script toutes les minutes ne fonctionne pas?

  3. #3
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Comme proposé par Kevin254kl, l'utilisation de la crontab est la bonne solution.

    Néanmoins, il faut faire attention aux choses suivantes : tous les chemins doivent être en absolu, et que se passe-t-il si deux exécutions, ou plus, sont lancées en même temps ?
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  4. #4
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut
    Tu peux en effet aussi lancer traitement en tache de fond avec un & apres son appel dans ta boucle
    mais avec la meme question : les fonctions traitement peuvent elles s'executer en parellele ?

  5. #5
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Pour ne pas lancer 2 traitements en parallèle, alors que le 1er n'est pas terminé, soit :
    - Quand ton script se lance, il écrit dans /var/run/monscript.pid (si le fichier existe déjà, on quitte)
    - Quand ton script se lance, il vérifie avec ps, qu'il n'est pas déjà en cours.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    Bonjour,

    le traitement() peut prendre du temps et le délai d'une minute entre chaque lancement ne serait plus respecté
    pour résumé :
    • soit tu laisses le traitement se terminer, et alors le délai d'une minute n'est pas respecté
    • soit tu ne lances pas de traitement concurrent en vérifiant qu'i n'était en cours d'exécution au préalable, et alors le délai d'une minute n'est pas respecté
    • soit «c'est bon ! on s'en fout !», et alors gare au bobo
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre averti
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Points : 330
    Points
    330
    Par défaut
    Citation Envoyé par ggnore Voir le message
    Pour ne pas lancer 2 traitements en parallèle, alors que le 1er n'est pas terminé, soit :
    - Quand ton script se lance, il écrit dans /var/run/monscript.pid (si le fichier existe déjà, on quitte)
    - Quand ton script se lance, il vérifie avec ps, qu'il n'est pas déjà en cours.
    Bonjour,

    ayant eu la meme problematique il y a peu de temps ce sujet m'interesse.
    Je lance avec un crontab un jar qui realise un long traitement.
    J'ai verifie pendant l'execution de celui-ci je ne vois aucune mention de celui-ci ni avec la commande ps ni dans var/run/.
    Il y a t il une option speciale a utiliser?

    Merci

  8. #8
    Membre averti
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Points : 330
    Points
    330
    Par défaut
    Citation Envoyé par kevin254kl Voir le message
    Bonjour, un chrontab qui lance ton script toutes les minutes ne fonctionne pas?
    PS c'est crontab -e

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Adjoint chef de centrale à béton
    Inscrit en
    Mars 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Adjoint chef de centrale à béton
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2015
    Messages : 2
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par xian21 Voir le message
    Bonjour,

    ayant eu la meme problematique il y a peu de temps ce sujet m'interesse.
    Je lance avec un crontab un jar qui realise un long traitement.
    J'ai verifie pendant l'execution de celui-ci je ne vois aucune mention de celui-ci ni avec la commande ps ni dans var/run/.
    Il y a t il une option speciale a utiliser?

    Merci
    Bonjour,
    Peut-être devrais tu utiliser une commande avec sudo, personnellement j'aime bien pgrep
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sudo pgrep -f nom_du_script

  10. #10
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    pour ce genre de problématique la manière la plus fiable de procéder est de créer un verrou (lock), souvent sous la forme d'un fichier

    au début du programme on vérifie si le fichier existe;
    - si oui c'est qu'une autre tache est déjà en train de s’exécuter (modulo quelques cas limites), donc on termine le programme
    - si non, alors on crée le fichier, une fois le traitement fini on efface le fichier et on termine le programme

    en revanche les fichiers dans /var/run/*pid sont des cas à part, ils ne sont pas obligatoirement créés (comprendre: rien ne le garanti), et il vaut mieux traiter la pose des verrous directement dans le programme

    penser également que si la machine crash pour une raison ou une autre il est préférable que le fichier de lock ne reste pas au prochain démarrage, le répertoire /tmp/ est en général vidé à chaque démarrage de la machine, ce qui en fait un bon candidat pour stocker les verrous temporaires, on trouve d'ailleurs couramment des fichiers comme /tmp/.X0-lock dedans

  11. #11
    Expert éminent sénior
    Avatar de Escapetiger
    Homme Profil pro
    Administrateur système Unix - Linux
    Inscrit en
    Juillet 2012
    Messages
    1 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur système Unix - Linux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 1 476
    Points : 11 051
    Points
    11 051
    Par défaut
    On peut rajouter le cas où le programme est terminé de façon abrupte, un kill SIGKILL par exemple. Il est utile alors de combiner le nom du fichier lock avec le PID du process et de vérifier si ledit process est encore actif.
    « Developpez.com est un groupe international de bénévoles dont la motivation est l'entraide au sens large » (incl. forums developpez.net)
    Club des professionnels en informatique

  12. #12
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    pour ce genre de problématique la manière la plus fiable de procéder est de créer un verrou (lock), souvent sous la forme d'un fichier
    Si le verrou est une bonne idée, le fichier est malheureusement une mauvaise implémentation, trop souvent utilisée. Si ton programme plante, ce qui peut arriver même aux meilleurs, ton fichier reste présent sur le disque, et les traitements suivants ne seront pas lancés.

    Le plus intéressant est l'utilisation de sockets, et particulièrement de socket Unix : tu ouvres une socket sur le port XXXXX dans ton programme : tant qu'il est vivant, la socket reste ouverte, et tu peux supprimer la socket proprement à la fin. Mais si ton programme plante, le système va automatiquement nettoyer la socket au bout d'un moment (2 minutes de mémoire, mais c'est configurable dans ton programme). Ainsi, tu louperas peut-être une exécution ou deux, mais au moins tu n'auras pas besoin d'une intervention manuelle pour supprimer le fichier.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  13. #13
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 103
    Points : 224
    Points
    224
    Par défaut
    Bonjour et merci à tous pour vos réponses !

    Finalement j'ai choisi d'utiliser la solution de Jean.Cri1. Comme mon traitement revient en boucle infinie, je n'ai pas besoin de vérifier s'il existe encore et un traitement en tâche de fond est exactement ce qu'il me faut. :-)

  14. #14
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    pour ce genre de problématique la manière la plus fiable de procéder est de créer un verrou (lock), souvent sous la forme d'un fichier

    au début du programme on vérifie si le fichier existe;
    - si oui c'est qu'une autre tache est déjà en train de s’exécuter (modulo quelques cas limites), donc on termine le programme
    - si non, alors on crée le fichier, une fois le traitement fini on efface le fichier et on termine le programme
    [chipotage]Si on ne fait pas le test et la création en une seule opération indivisible (test and set), il y a toujours la probabilité (quoique très faible) qu'un programme concurrent fasse la même chose au même moment:
    - les 2 programmes testent en même temps l'existence du fichier de lock.
    - le fichier de lock n'existe pas.
    - les 2 programmes tentent de le créer (un seul réussit vraiment).
    - les 2 programmes continuent en ayant cru l'avoir créé...

    Il vaut mieux (si on reste sur la solution d'un fichier de lock géré manuellement):
    - créer un répertoire (et non un fichier) avec mkdir
    - tester le code de retour du mkdir
    - si le code retour est différent de 0 (la création a échoué), terminer le programme.
    - si le code retour est 0 (la création a réussi), alors continuer.
    [/chipotage]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment lancer toutes les minutes ma commande via cron ?
    Par taffMan dans le forum Applications et environnements graphiques
    Réponses: 23
    Dernier message: 27/08/2007, 17h54
  2. Lancer un programme toutes les 5 minutes
    Par Empty_body dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 12/07/2006, 18h24
  3. Lancer une fct toutes les x minutes
    Par mambo dans le forum MFC
    Réponses: 8
    Dernier message: 21/06/2006, 23h16
  4. lancer une procedure toutes les minutes precisemment
    Par Alextk dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 06/06/2006, 15h10
  5. Réponses: 2
    Dernier message: 17/01/2005, 14h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo