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 :

Emplacement des fichiers lors d'un script lancé par crontab


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut Emplacement des fichiers lors d'un script lancé par crontab
    Bonjour,
    Sur une ligne adsl, j'ai un serveur de connecté avec une IP dynamique; j'ai un petit script qui m'infome par mail lors d'un changement d'IP.
    Dans ce script, j'ai d'abord une requete java qui récupère l'adresse IP en cours et la met dans un fichier ftemp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Requete.java {
    ....
    FileWriter resultFile = new FileWriter("/home/toto/test/ftemp");
    ....
    }
    Puis le script proprement dit qui compare l'adresse de ftemp avec la dernière adresse valide contenue dans le fichier ipaddress :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    scriptip
    #!/bin/bash
    
    java getip.Requete
    cat ftemp >> ipaddress
    tr -d '\n' < ipaddress > ftemp
    IFS=\: read ip1 ip2 < ftemp
    echo $ip1
    echo $ip2
    if [ $ip1 != $ip2 ]; then
      echo $ip2 | mutt -s "Local IP" xxxxxx@free.fr;
    fi 
    ...
    Ce script est lancé périodiquement par crontab :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    */30 * * * * /home/toto/test/scriptip
    Le problème est qu'en procédant de cette façon, je me retrouve avec les fichiers ftemp et ipaddress dans le directory /home/toto alors que je m'attends à les avoir dans /home/toto/test. Si je lance le script manuellement en étant dans /home/toto/test les fichiers sont au bon endroit. : comment procéder pour avoir les fichiers au bon endroit lors d'un lancement par crontab?

  2. #2
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    En faisant précéder tes noms de fichiers du répertoire où se trouve ton script ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    script_dir=${0%/*}cat "$script_dir/ftemp" >> "$script_dir/ipaddress"
    +++

    Rq : étant donné comment est posé le problème, ça devrait aller, mais en général, $0 pourrait être un simple nom de fichier (pas un chemin, donc ne contenant pas de /), et donc ${0%/*} ne renverrait pas ce qu'on veut.
    Plutôt que de réinventer la roue dans ce cas, et puisque ça n'est fait qu'une fois en entrée de script, il vaudrait mieux utiliser dirname :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    script_dir=$(dirname "$0")
    car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ dirname nom-de-fichier-sans-slash
    .
    $

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

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

    pourquoi java, et pas simplement hostname -I (ou équivalent sur la distrib du serveur) ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    Euh ... parce qu'aucune des adresses listées ne correspond à l'adresse ipv4 par laquelle on est reconnue de l'extérieur ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Merci pour la réponse, si celà fonctionne bien pour les commandes shell, j'ai un problème pour la ligne java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ....
    script_dir=${0%/*}
    echo $script_dir
    java -classpath $script_dir getip.Requete
    cat "$script_dir/ftemp" >> "$script_dir/ipaddress"
    ....
    A partir du répertoire utilisateur toto la commande manuelle :
    fonctionne et crée le fichier ftemp dans le répertoire test
    Par contre celà n'a pas lieu si j'appelle le script à partir de crontab.

  6. #6
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Problème de PATH ?
    Mets le chemin complet de ton exécutable, probablement /usr/bin/java.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    mais,
    pourquoi java, et pas dig +short myip.opendns.com @resolver1.opendns.com. ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par balkany
    Problème de PATH ?
    Exact.

    Pour l'utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bash: /usr/local/bin:/usr/bin:/bin:/usr/games:/usr/lib64/java/bin:/usr/lib64/java/jre/bin:/usr/lib64/kde4/libexec:/usr/lib64/qt/bin:/usr/lib64/qt5/bin:/usr/share/texmf/bin: No such file or directory
    Dans le script lancé par crontab :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $PATH=/sbin:/usr/sbin:/bin:/usr/bin
    Bizarre vu que chaque utilisateur a un crontab : je pensais que crontab allait reprendre le PATH utilisateur. (ou alors on ne considère que crontab n'est fait que pour lancer des scripts shell)
    D'ou la commande qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/lib64/java/jre/bin/java -classpath $script_dir getip.Requete
    @balkany : 2 mots sur l'expression {0%/*} pour ma compréhension.
    @N_BaH : pourquoi java? parce que pas réussi à le faire en bash. Je récupère l'IP sur http://ipecho.net/plain; facile à extraire.
    Et sur le serveur, j'ai un linux "particulier" : Linux/Ubuntu sur architecture arm (portage effectué par le fabricant du matériel). Et j'ai constaté plusieurs anomalies :
    • wget : souvent bloquant
    • curl, telnet, dig : inconnu
    • iptables : certains paramètres non reconnus
    • installation java avec apt-get : environnement de compilation JDK -java 7- ; environnement exécution JRE -java6-

    Vu ces désagréments, je valide tout sur mon PC (Linux/Slackware) et je transfère ensuite par ssh sur le serveur, et je valide de nouveau.
    Et vu ce que j'ai constaté avec java, pour toute nouvelle installation, j'y vais sur la pointe des pieds.

  9. #9
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Concernant la crontab, par défaut elle n'a pas d'environnement. Il faut soit mettre les chemins absolus pour chaque commande, soit sourcer ton environnement utilisateur, soit définir tes variables d'environnement dans ton script.

    Pour l'adresse IP, perso j'utilise ifconfig.me avec les syntaxes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    curl ifconfig.me
     
    wget -qO- ifconfig.me
     
    http -b ifconfig.me


    PS. Sur le lien que tu utilises pour l'IP, on peut y lire :
    Please don't abuse the system, try to cache the IP for a reasonable amount of time before doing another request, so everyone can enjoy it.
    Source :https://ipecho.net/developers.html
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  10. #10
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    @zipe31 : merci pour les précisions sur le PATH de crontab et le service de remplacement à ipecho.

    Et pour la remarque :
    Please don't abuse the system, try to cache the IP for a reasonable amount of time before doing another request, so everyone can enjoy it.
    Qu'entend t-on par délai raisonnable entre 2 requetes? A l'appréciation de chacun?
    En tout cas c'est sympa de mettre un service à disposition.

    Petite question complémentaire : la longueur minimale d'une adresse IP est de 7 caractères (par exemple : 1.1.1.1); si dans le fichier ipaddress j'ai une longueur inférieure à 7 (pour cause d'anomalie dans le processus), je veux remettre dans le fichier une adresse par défaut de 7 caractères avec le script suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    wc -m "$script_dir/ipaddress" | awk -F" " '{{print $1}}' > "$script_dir/wcfile"
    IFS= read wcount < "$script_dir/wcfile"
    echo $wcount
    if [ $wcount -lt 7 ]; then
      echo "0.0.0.0:" > "$script_dir/ipaddress";
    fi
    C'est une écriture step by step; je pense que l'on peut faire une écriture plus condensée.

  11. #11
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Pour info concernant la longueur d'une variable…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ A=bonjour;B=Hello
     
    $ echo ${#A}
    7
     
    $ echo ${#B}
    5
    Sinon, pour les services IP il y a aussi ipinfo.io : curl ipinfo.io/ip

    Édit : Correction balise code
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  12. #12
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par hapalemur Voir le message
    @balkany : 2 mots sur l'expression {0%/*} pour ma compréhension.
    C'est du développement de variable, ici la variable $0, dont on enlève le plus petit suffixe (%) de la forme /* :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ var=/chemin/fichier
    $ echo "${var%/*}"
    /chemin
    $
    Pour ton ip en #10, tu peux faire (entre autres) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (($(wc -m <"$script_dir/ipaddress") < 7)) && echo '0.0.0.0:' >"$script_dir/ipaddress"

  13. #13
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Merci pour les compléments de réponse.

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

Discussions similaires

  1. [Batch] Caractères spéciaux (©) dans le chemin des fichiers lors d'un script copy
    Par SylvainM dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 02/09/2014, 16h48
  2. Réponses: 3
    Dernier message: 29/08/2007, 09h24
  3. [log4j] emplacement des fichiers .log
    Par danyboy85 dans le forum Logging
    Réponses: 7
    Dernier message: 18/01/2007, 07h47
  4. Réponses: 5
    Dernier message: 15/09/2006, 14h26
  5. Réponses: 14
    Dernier message: 24/08/2006, 13h53

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