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 :

[Bash] Script lancé seul dans le shell s'execute correctement, mais lancé via un script fonctionne moins


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier Avatar de AvySamaj
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 118
    Points : 75
    Points
    75
    Par défaut [Bash] Script lancé seul dans le shell s'execute correctement, mais lancé via un script fonctionne moins
    Bonjour j'utilise Ubuntu 18.03.4 et bash 4.4.20.

    Quand je lance le script seul via le shell, ./scriptWebCrawling1.sh arg1 arg2, il s'exécute correctement. Il m'interroge via le prompt comme attendu et ensuite exécute les tâches comme attendues.
    Mais bizarrement une fois lancé via un script de la façon suivante il ne fonctionne plus aussi bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
    #MajorScript.sh
    echo -e "choix 1: machin, choix 2: le reste"
    read -p "Indiquer votre choix: [1 ou 2] " choix
    if [ $choix -eq 1 ]; then
        ./scriptWebCrawling1.sh 1 5 
    elif [ $choix -eq 2 ]; then
        ./scriptWebCrawling2.sh 1 5 
    else
        echo "Je ne comprend pas votre choix : ${choix}"
    fi
    Là c'est très étrange pcq autant le script s’exécute lorsqu'il s'agit d'interroger l'utilisateur via les commandes prompt, mais une fois qu'il faut exécuter des tâches il s'arrête tout simplement et rend le shell: (base) user@machine:.
    Par ailleurs j'ai essayé avec les deux scripts et ça me donne le même problème.

    J'ai essayé de mettre le mot clé source devant ./scriptWebCrawling1.sh 1 5 mais rien y fait. Je me suis même penché à savoir si c'était une question de permissions mais non, d'autres scripts qui ne figurent pas ici sont exécuté sans problème. La différence de c'est dernier c'est que j'ai créé un lien symbolique dans /usr/bin pour les lancer via un nom. J'ai donc tenté la même chose avec scriptWebCrawling1.sh donc de créer un lien symbolique dans /usr/bin et ça ne marche toujours pas comme il faudrait. Ça ne change rien en fait.

    Voici mes scripts dans mon DropBox que je supprimerai une fois résolu, comme ça rien ne vous échappera si c'est nécessaire toutefois :

    MajorScript.sh
    scriptWebCrawling2.sh
    scriptWebCrawling1.sh

    Je ne suis pas experte du tout dans le bash, donc ne soyez pas choqués de voir des structures plus compliqués que ce que vous auriez fait, je débute.

  2. #2
    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 458
    Points
    13 458
    Par défaut
    Bonjour

    2 fautes :
    • Indiquez votre choix: [1 ou 2]
    • Je ne comprends pas votre choix


    De plus, tes liens ne marchent pas. Il vaut mieux copier-coller le code entre deux balises "code".

    Pour l'instant, le code montré est plutôt correct.

    ./scriptWebCrawling1.sh 1 5
    Es-tu vraiment sure que le script sera appelé du bon répertoire ? Le conseil est de mettre le chemin complet.

    read -p "Indiquez votre choix: [1 ou 2] " choix
    Vue la suite, préférons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    read -n 1 -p "Indiquez votre choix: [1 ou 2] " choix
    echo
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre régulier Avatar de AvySamaj
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 118
    Points : 75
    Points
    75
    Par défaut
    C'est étrange que mes liens ne marchent pas car depuis mon téléphone j'y ai accès depuis ce topic en cliquant sur les liens.

    Oui je suis sûr que le script est dans le bon répertoire car les 3 que je confie ici sont tous dans le même répertoire. Ce sont les deux autres premiers (dans le code source visible dans drop box) qui n'y sont pas et que je ne donne pas pcq ils fonctionnent, d'où l'idée d'y faire des liens symboliques dans /usr/bin.

    Pour preuve l'arborescence est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    / (la racine)
    |__ /etc/tor
    |      |__ instances.sh #son lien symbolique est nommé createurInstancesTor dans MajorScript.sh
    |      |__ lancementTorPolipo.sh #son lien symbolique est nommé lancementTorEtPolipo dans MajorScript.sh
    |
    |__/home/user/projet/scripts
           |__ MajorScript.sh
           |__ correction_champs.sh
           |__ correction_numero_course.sh #son lien symbolique est nommé corrigeNumeroCourse dans MajorScript.sh
    Je vais copié coller le code de deux scripts, j'aurais préféré pas le faire pcq y en a des lignes...

    MajorScript.sh
    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
    #!/bin/bash
    ##SCRIPT DES SCRIPTS
    echo -e "Bonjour.\nVous êtes dans le script de lancement de spiders du projet X"
    read -p "Pour commencer avez-vous besoin de créer de nouveaux fichiers de configuration tor (torrc)? [o/n]" creationTorrc
    read -p "Combien d'instances souhaitez vous? " nbInstances
    read -p "À partir de quel port d'écoute souhaitez-vous commencer? [30001 à 65535] " premierPort
    read -p "Confirmez-vous vouloir commencer au port ${premierPort} ? [o:n]" confirmationPort
    if [ $confirmationPort != "o"]; then
    	echo -e "Vous ne confirmez pas ${premierPort} comme premier port.\nAu revoir"
    	exit
    else
    	#creation du second paramètre de position pour les scripts
    	debut=$(($premierPort-30000))
    	if [ $creationTorrc = "o" ]; then
    		###Creation fichier torrc
    		sudo createurInstancesTor start $debut $nbInstances #MARCHE TRÈS BIEN VIA CE SCRIPT
    	fi
    	###Lancement tor et polipo
    	sudo lancementTorEtPolipo start $debut $nbInstances #MARCHE TRÈS BIEN VIA CE SCRIPT
    	###Attente que tous les lancement soit opérés:
    	for i in `seq $debut $nbInstances`; do
    		tail -n +1 -f /var/log/tor$i/notices.log | grep -m 1 "Bootstrapped 100%" 
    	done
    	###Lancer Mongo si le service n'est pas déjà ouvert
    	if pgrep -x "mongod" > /dev/null
            then
        	echo "Mongod est déjà lancé"
    	else
    		sudo service mongod start
        	echo "On lance mongod"
    	fi
    	###Lancement des spiders
    	##Choix des spiders à titre exceptionnel
    	echo -e "choix 1: corriger numero_course, choix 2: le reste"
    	read -n 1 -p "Indiquez votre choix: [1 ou 2] " choix
    	if [ $choix -eq 1 ]; then
    		/home/avy/Turf/bots/.../scriptsBash/correction_numero_course.sh $debut $nbInstances #; pid=$! #/!\ lien symbolique
    	elif [ $choix -eq 2 ]; then
    		./correction_champs.sh $debut $nbInstances #; pid=$!
    	else
    		echo "Je n'ai compris votre choix: ${choix}"
    	fi
    	#wait $pid
    	#echo "Le crawling devrait être terminé"
    	###Fermeture polipo et tor et suppresion fichier torrc
    	#read -p "Souhaitez-vous fermer les ports utiliser par Tor et Polipo ? [o/n]" confirmationFinProcessus
    	#if [ confirmationFinProcessus != "n" ]; then
    	#	sudo lancementTorEtPolipo stop $debut $nbInstances
    	#	echo "Les ports sont maintenant fermés"
    	#fi
    	#read -p "Souhaitez-vous supprimer les fichiers de configurations de tor (torrc)? [o/n]]" confirmationFinInstances
    	#if [ confirmationFinInstances != "n" ]; then
    	#	sudo createurInstancesTor stop $debut $nbInstances
    	#	echo "les fichiers de configurations de tor ont été supprimés"
    	#fi
    fi
    correction_numero_course.sh
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    #!/bin/bash
     
    echo -e "Bonjour.\nVous voici dans le script qui lance le spider num_course_PT"
    echo -e "Un seul mode est disponible:\nScraper via une liste d'urls préétablie dans un fichier .json pour MAJ d'un champ"
     
    #Saisi du nom de fichier d'urls
    echo -e "Les fichiers doivent se trouver dans le dossier:\n~/Turf/données/Webcrawling/fichiersUrlsJSON\nVeuillez vérifier que votre fichier s'y trouve"
    cheminFichierUrl=/home/avy/Turf/données/Webcrawling/fichiersUrlsJSON/
    read -p "Entrez le nom de votre fichier d'urls: " fichierUrls
    fichier=$cheminFichierUrl$fichierUrls
    echo "Vous avez choisi le chemin de fichier d'urls :\n$fichier"
    read -p 'Confirmez-vous ce chemin : [o/n]' confirmationChemin
    if [ ! -e $fichier ]; then #si le fichier n'existe pas
    	echo -e "Le fichier $fichier n'existe pas.\nVeuillez recommencer"
    	exit
    elif [ $confirmationChemin != "o" ]; then
    	echo -e "Vous ne confirmez pas.\nAu revoir"
    	exit
    fi
    #Création du champ_corrige qui n'est autre que numero_course
    champCorrige="numero_course"
    read -p "Confirmez-vous que le champ_corrige sera numero_course ? [o/n]" confirmationChamp
    #dossier log
    cheminFichierLog=/home/avy/Turf/bots/paris-turf/courses_p_t/courses_p_t/spiders/logs/maj/
    if [ ! -d $cheminFichierLog$champCorrige ]; then #si le dossier n'existe pas, le créer
    	mkdir $cheminFichierLog$champCorrige
    fi 
    log=$cheminFichierLog$champCorrige/
    echo -e "Le scrap va commencer. Le log sera dans le dossier:\n${log}"
    #Etablissement des paramètres du spiders
    if [ $confirmationChamp = "o" ]; then
    	tableauParametres=()
    	tableauParametres[${#tableauParametres[*]}]="-a lo_lim="
    	tableauParametres[${#tableauParametres[*]}]="-a up_lim="
    	tableauParametres[${#tableauParametres[*]}]="-a test=true"
    	tableauParametres[${#tableauParametres[*]}]="-a correcteur=true"
    	tableauParametres[${#tableauParametres[*]}]="-a champ_corrige=${champCorrige}"
    	tableauParametres[${#tableauParametres[*]}]="-a via_fichier=true"
    	tableauParametres[${#tableauParametres[*]}]="-a chemin_fichier=${fichier}"
    	tableauParametres[${#tableauParametres[*]}]="-s LOG_FILE=${log}${champCorrige}"
    	tableauParametres[${#tableauParametres[*]}]="-s HTTP_PROXY="
    	#Confirmation des paramètres
    	echo "les paramètres choisis sont: ${tableauParametres[@]}"
    	read -p 'Confirmez-vous les paramètres : ' confirmationParametres
    	if [ $confirmationParametres != "o" ]; then
    		echo -e "Vous ne confirmez pas.\nAu revoir."
    		exit
    	else
    		tailleFichier=$(($(wc -l < $fichier)-2))
    		compteur=1
    		read -p "Combien de tentative(s) souhaitez-vous?" nbTentatives
    		while [ $tailleFichier -ne 0 ] && [ $compteur -le $nbTentatives ]; do
    			nbCourses=$(($(wc -l < $fichier)-2))
    			minInstances=$1
    			maxInstances=$2
    			if [ $maxInstances -lt $nbCourses ]; then
    				Pas=$(($nbCourses/$maxInstances))
    				maxSeq=$maxInstances
    			else
    				Pas=$nbCourses
    				maxSeq=$nbCourses
    			fi
    			Reste=0 #nombre d'urls scrapé pour calculer ensuite le reste
    			##Lancement des instances du spider
    			pids=()
    			for i in `seq $1 $maxSeq`
    			do 
    				echo "Création d'instance de spider numéro ${i}"
    				#paramètre up_lim
    				if [ `expr $nbCourses - $Reste` -gt $Pas ]; then
    					RestePlusPas=$(($Reste+$Pas))
    				else
    					RestePlusPas=$(($Reste + ($nbCourses-$Reste) + 1))
    				fi
    				numeroPortProxy=$(($i+30000))
    				echo -e "commande :\nscrapy crawl num_course_PT ${tableauParametres[0]}${Reste} ${tableauParametres[1]}${RestePlusPas} ${tableauParametres[@]:2:${#tableauParametres[@]}-4} ${tableauParametres[-2]}${i} ${tableauParametres[-1]}http://127.0.0.1:${numeroPortProxy}"
    				echo "o" | (scrapy crawl num_course_PT ${tableauParametres[0]}${Reste} ${tableauParametres[1]}${RestePlusPas} ${tableauParametres[@]:2:${#tableauParametres[@]}-4} ${tableauParametres[-2]}${i} ${tableauParametres[-1]}http://127.0.0.1:${numeroPortProxy}) & pids[$i]=$! &
    				#maj paramètre lo_lim pour l'instance suivante
    				if [ `expr $nbCourses - $Reste` -gt $Pas ]
    				then
    					Reste=$(($Reste + $Pas))
    				fi
    			done
    			echo "***************************************"
    			echo "Attend la fin des processus scrapy, et le compteur vaut: ${compteur}"
    			echo "***************************************"
    			wait "${pids[@]}"
    			echo "Là les processus scrapy ont terminé le travail"
    			echo "***************************************"
    			cheminMongoScript=/home/avy/Turf/bots/correction/corrections/
    			fichierMongoScript=scriptCreateurFichiersURL.js
    			mongo --quiet $cheminMongoScript$fichierMongoScript > $fichier
    			compteur=$(($compteur+1))
    		done
    	fi
    else
    	echo "Vous ne confirmez pas le champ numero_course.\nAurevoir"
    	exit
    fi

  4. #4
    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
    MajorScript ligne 37, il manque le chemin vers un script.

    comme l'a dit Flodelarab, il est préférable d'indiquer le chemin absolu vers les commandes et les scripts qui ne sont pas dans le PATH.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Bonjour,

    Il y a une erreur dans le premier script (MajorScript.sh) , ligne 21: la variable "fin" n'est pas initialisée...

    Mais bon, je doute que cela soit la cause de ton problème.
    Cordialement.

  6. #6
    Membre régulier Avatar de AvySamaj
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 118
    Points : 75
    Points
    75
    Par défaut
    Ligne 37 de MajorScript, il ne manque pas le chemin. Il a un nom ainsi car j'ai créé une valeur symbolique. En le remplaçant par son chemin complet ça ne marche pas mieux j'ai toujours la même chose.
    Ligne 21 j'ai modifié, par $nbInstances, en effet $fin n'était pas initialisé mais ça ne change pas le problème d’exécution.

  7. #7
    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 458
    Points
    13 458
    Par défaut
    Oui je suis sûr que le script est dans le bon répertoire car les 3 que je confie ici sont tous dans le même répertoire.
    Voilà qui ne prouve absolument rien. Tout les scripts peuvent être appelés de partout. . symbolise le répertoire courant. Et tu auras beau mettre tous tes scripts dans /usr/bin, si tu les appelles du dossier /dossier/quelconque, alors il tentera d'exécuter /dossier/quelconque/scriptWebCrawling1.sh 1 5. Et pas /usr/bin/scriptWebCrawling1.sh 1 5.


    Qu'est-ce que tu veux qu'on te dise ? Tu es bonne pour une séance de débogage. Repérer la ligne qui ne fait pas ce que tu veux, et la changer.

    Commande pour commencer le débogage :
    Il va écrire les vraies commandes qui sont exécutées.

    Commande pour arrêter le débogage :
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Membre régulier Avatar de AvySamaj
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 118
    Points : 75
    Points
    75
    Par défaut Problème résolu.
    Citation Envoyé par Flodelarab Voir le message
    Voilà qui ne prouve absolument rien. Tout les scripts peuvent être appelés de partout. . symbolise le répertoire courant. Et tu auras beau mettre tous tes scripts dans /usr/bin, si tu les appelles du dossier /dossier/quelconque, alors il tentera d'exécuter /dossier/quelconque/scriptWebCrawling1.sh 1 5. Et pas /usr/bin/scriptWebCrawling1.sh 1 5.

    Ça encore c'est bon à savoir, mais dans tous les cas j'étais sûre que j'étais au bon endroit.
    J'ai trouvé la ligne qui n'allait pas via #!/bin/bash -xv. En fait c'est plutôt le fichier dont elle dépendait qui n'allait pas fichierMongoScript=scriptCreateurFichiersURL.js, pas le script en lui même. Je vais devoir donc faire un ensemble du fonctionnement plus strict.

    Merci.

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

Discussions similaires

  1. Lancer un script dans un shell bash sou debian
    Par vandman dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 29/10/2015, 09h57
  2. retour à la ligne dans le shell bash, inputrc?
    Par reptils dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 03/12/2008, 10h07
  3. [Shell] Bash : script de gestion d'utilisateurs
    Par techafi dans le forum Linux
    Réponses: 1
    Dernier message: 14/03/2008, 22h13
  4. Intégrer un shell script dans le shell ?
    Par damien27000 dans le forum Linux
    Réponses: 3
    Dernier message: 23/07/2007, 23h04
  5. [AIX] plusieurs sous-scripts dans un shell
    Par fguigui dans le forum AIX
    Réponses: 4
    Dernier message: 10/04/2007, 11h14

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