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 :

Timer réinitialisable en shell


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 11
    Par défaut Timer réinitialisable en shell
    bonjour tout le monde,

    Voici mon contexte : je mets en place une vidéo surveillance. J'ai une caméra IP qui détecte le mouvement et envoie des vidéos et des photos par FTP.
    J'ai installé un Raspberry PI3 avec un serveur FTP. La caméra lui envoie ses fichiers, et j'ai mis un cron pour virer les fichiers de + de 5 jours.
    Tout ça marche très bien.

    Oui, mais si je suis cambriolé et qu'on me vole le Raspberry, je suis marron.
    Comme j'ai un espace de stockage chez mon FAI (free), accessible par FTP, je pourrais décider d'uploader les fichiers chez lui, plutôt que sur mon Raspberry.
    2 problèmes :
    - si le voleur coupe le fil du téléphone, je suis marron.
    - je ne sais pas virer les fichiers anciens sur le FTP du FAI (enfin je peux y arriver mais c'est galère de le faire régulièrement ).

    Alors j'ai choisi de mettre les fichiers sur le raspberry, et de les "mirrorer" chez le FAI.
    Il faut que le mirroring se fasse vite - disons dans les 3 à 5 mn après détection.
    J'ai mis en place un "incron", qui détecte les évènements file-system dans les répertoires de mes fichiers, sur le raspberry.
    J'ai ainsi un script shell (bash) qui est invoqué
    - à la création d'un fichier
    - à la fermeture d'un fichier après écriture
    - à la suppression d'un fichier.

    Quand un de ces évènements survient, je peux lancer le mirroring chez mon FAI par lftp.
    Mais il faut différer un peu le mirroring car la caméra envoie plusieurs fichiers sur détection. Il faut attendre qu'elle ait fini !
    De même, mon cron de nettoyage supprime plusieurs fichiers, il vaut mieux attendre qu'il ait fini.

    Alors, voici ce dont j'ai besoin : une attente qui soit "resetable".
    Lorsque qu'un fichier est terminé (closed), je lance l'attente pour 3 mn.
    Si un nouveau fichier arrive (create) ou si un ficher est effacé (delete), je réarme l'attente à 3mn
    Si l'attente va bout des 3 mn, je fais le mirroring.
    Si je reçois un nouveau fichier pendant le transfert FTP du mirroring, je tue la tâche FTP et je recommence (attente 3mn)

    Voici la soliution que j'ai trouvée. Merci de commenter si c'est foireux ou s'il y a mieux !
    Mon script do_mirroring.sh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PID_FILE=/var/run/do_mirroring.pid
    echo $$ > $PID_FILE
    sleep 180
    lftp ftp://myaccount:mypasswd@ftpperso.free.fr -e "mirror -e -R /home/pi/Camera /Camera ; quit"
    rm $PID_FILE
    mon script callback_incron.sh, invoqué par incrond en cas d'événement fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    PID_FILE=/var/run/do_mirroring.pid
    #------------------------
    file_created()
    {
      echo  "File created: "  $1/$2 " le " $(date) >> /home/pi/incron.log
      # un nouveau fichier arrive
      # arreter le mirroring si en cours 
      if [ -r $PID_FILE ] then
        kill $(cat $PID_FILE)
        rm $PID_FILE
      fi
    }
    #------------------------
    file_closed()
    {
      echo  "File closed : "  $1/$2 " le " $(date) >> /home/pi/incron.log
      # un nouveau fichier est termine :
      # arreter le mirroring si en cours 
      if [ -r $PID_FILE ] then
        kill $(cat $PID_FILE)
        rm $PID_FILE
      fi
      # et lancer
      ~/do_mirroring.sh
    }
    #------------------------
    file_deleted()
    {
      echo  "File deleted: "  $1/$2 " le " $(date) >> /home/pi/incron.log
      # un nouveau fichier est efface :
      # arreter le mirroring si en cours 
      if [ -r $PID_FILE ] then
        kill $(cat $PID_FILE)
        rm $PID_FILE
      fi
      # et lancer
      ~/do_mirroring.sh
    }
    #------------------------
    # les arguments sont : 1=type d'évènement 3=chemin du fichier 4=nom du fichier
    #------------------------
    case $1 in
      IN_CREATE)
        file_created $3 $4
        ;;
      IN_CLOSE_WRITE)
        file_closed $3 $4 
        ;;
      IN_DELETE)
        file_deleted $3 $4
        ;;
      *)
        echo  "Event: " $1 " (" $2 ")  File: "  $3/$4 " le " $(date) >> /home/pi/incron.log
        ;;
    esac
    Merci d'avoir lu !

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    pour être sûr de tuer lftp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lftp ftp://myaccount:mypasswd@ftpperso.free.fr -e 'mirror -e -R /home/pi/Camera /Camera ; quit' & echo !! >"$PID_file"
    wait
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Par défaut
    Davantage de logs et de gestion d'erreurs serait sympa.
    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

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/08/2014, 21h51
  2. Valeur d'un timer qui se réinitialise
    Par snoopy69 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 11/11/2009, 10h35
  3. Timer de précision
    Par guigui dans le forum MFC
    Réponses: 1
    Dernier message: 04/12/2002, 15h21
  4. Timer en µsecondes
    Par Dagobert dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 25/11/2002, 00h59
  5. [Kylix] probleme pour lancer le shell
    Par miky dans le forum EDI
    Réponses: 5
    Dernier message: 13/08/2002, 09h39

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