Pages : 1
#1 Le 08/01/2013, à 13:29
- omnimax
script if où est l'erreur
Bonjour,
Je ne comprends pas pourquoi ce script ne fonctionne pas ????
si *.part existe alors tu fais juste ok sinon tu copies tous les fichiers à un un emplacement et tu m’envoies un mail à mon adresse mail .
En fait lorsque je le lance et qu'il reste un fichier.part, il m'exécute la seconde commande ?
Merci de m'éclairer.
#!/bin/sh
#şcript doci
fichier=$(ls /home/$USER/Téléchargements/*.part)
if [ -e "$fichier" ]; then
echo "ok"
else
cp /home/$USER/Téléchargements/* /EMPLACEMENT && echo "cc op" | msmtp MONMAIL
fi
exit 0
Dernière modification par greg2007 (Le 08/01/2013, à 13:29)
14.04 unity et Linux Mint KDE 13 zsh-meilleur shell script fire
Hors ligne
#2 Le 08/01/2013, à 13:54
- shoot76
Re : script if où est l'erreur
Personnellement j'aurais utilisé une boucle, afin de tester un par un les fichiers. Ta syntaxe me parait douteuse dans le sens où tu récupères uniquement le résultat d'une commande et tu la traite, sans l'avoir décortiquée avant (question de goûts ^^) il suffit que ls traite la commande comme une seule et uniquement chaine de caractères et t'es niqué.
#!/bin/sh
#script doci
fichier=()
for part in $(ls /home/$USER/Téléchargements/*.part); do
fichier+=($part)
done
if [ $(echo ${#fichier[@]}) -eq "0"]; then
echo "ok"
else
cp /home/$USER/Téléchargements/* /EMPLACEMENT && echo "cc op" | msmtp MONMAIL
fi
exit $0
Dernière modification par shoot76 (Le 08/01/2013, à 13:58)
~ Data-sientist freelance : https://skulder.fr
Hors ligne
#3 Le 08/01/2013, à 13:59
- shoot76
Re : script if où est l'erreur
Je pense qu'il parle de fichier compressé mais divisés en plusieurs petits fichiers partitionnés et quelques centaines de méga en général, qui portent l'extension .part. archive1.part etc.
~ Data-sientist freelance : https://skulder.fr
Hors ligne
#4 Le 08/01/2013, à 14:01
- pingouinux
Re : script if où est l'erreur
Bonjour,
C'est parce que la variable fichier va contenir une liste de fichiers, et tu testes si cette liste est un fichier existant.
Je ferais plutôt comme ceci :
n=$(ls *.part|wc -l)
if [ $n -gt 0 ]; then
...............
Hors ligne
#5 Le 08/01/2013, à 14:38
- omnimax
Re : script if où est l'erreur
merci à tous pour vos réponses, j'ai bien compris l'erreur,
Par contre shoot76, peux tu m'expliquer un plus l'extrait de cette commande, je ne la comprends pas bien
fichier+=($part)
done
if [ $(echo ${#fichier[@]}) -eq "0"]
et aussi une bête question que je me pose, dans un script shell est ce que
#!/bin/sh
commande 1
commande 2
exit 0
équivaut aussi à ceci
#!/bin/sh
commande 1 && commande 2
exit 0
Dernière modification par greg2007 (Le 08/01/2013, à 14:45)
14.04 unity et Linux Mint KDE 13 zsh-meilleur shell script fire
Hors ligne
#6 Le 08/01/2013, à 14:55
- shoot76
Re : script if où est l'erreur
Pour ta deuxième question, oui ça revient au même, vu que le && permet d'executer une commande successivement à une autre, tandis que le script bash parcours les commandes de haut en bas. Donc commande 1 && commande 2 = commande 1 (saut de ligne) commande 2
Ensuite pour ma commande, je t'explique. Je créé un tableau vide nommé fichier, et j'y ajoute (fichier+=(...)) l'occurrence de $part. En fait, au lieu d'avoir un résultat stocké anarchiquement dans une variable, j'aurais un tableau contenant les n occurrence de ton ls. Si tu as 120 fichiers .part dans ton dossier, ce tableau aura 120 colonnes. En suite, je récupère le nombre de colonnes justement avec le echo dans le if, et je le teste. Si il est égal à zéro (donc que tu n'as aucun fichier .part) alors j'affiche ok, si il est différent de zéro, je copie tous les fichiers dans un dossier EMPLACEMENT et je t'envoi un mail.
C'est une méthode différente de la tienne, mais plus stable, car au lieu d'utiliser directement le résultat d'une commande, j'utilise chacun des nom de fichiers un par un. Ce qui signifie déjà, que le calcul est plus simple, et d'autre part, que si tu as des actions à effectuer sur ces fichiers, tu peux le faire, alors qu'avant tu ne pouvais pas.
Par exemple, tu veux décompresser un seul des fichiers .part, tu devras rentrer la commande rar $fichier(position de ton .part). Je trouve ça beaucoup plus pratique et stable. Bien que je n'ai pas testé le programme que je te propose ^^ si tu as des erreurs ou d'autres questions, n'hésite pas
Dernière modification par shoot76 (Le 08/01/2013, à 15:14)
~ Data-sientist freelance : https://skulder.fr
Hors ligne
#7 Le 08/01/2013, à 15:05
- pingouinux
Re : script if où est l'erreur
@greg2007 #7 et shoot76 #8
Pour moi
commande 1
commande 2
n'est pas équivalent à
commande 1 && commande 2
Dans le second cas, commande 2 n'est exécutée que si commande 1 se termine sans erreur.
Hors ligne
#8 Le 08/01/2013, à 15:14
- shoot76
Re : script if où est l'erreur
Ah oui en effet j'avais omis ce détail; Merci de me le rappeler
Autant pour moi.
~ Data-sientist freelance : https://skulder.fr
Hors ligne
#9 Le 08/01/2013, à 20:27
- omnimax
Re : script if où est l'erreur
Merci pour les explications j'ai appris un nouveau truc
Par contre c'est fou comme quoi un bête petit script à la base peut poser d'autres soucis à régler...c'est un peu excitant
en fait le script est mtnt opérationnel grâce à vos aides le hic c'est que je le lance via cron tous les x minutes, donc le problème qui peut arriver c'est que si je fait une copie de fichiers à 13H05 et que si à 13h15 le script se relance et que la copie n'est toujours pas terminée il va tenter de le recopier...
Il faudrait donc que je dise par exemple au script, attention si une instance de ce script tourne alors tu te coupes.
j'ai trouvé un début de commande mais je ne sais pas si c'est la bonne méthode ...
instance=$(top | grep nomduscript)
if $instance = nomduscript then ; killall nomduscript
else reste du script ....
Dernière modification par greg2007 (Le 08/01/2013, à 20:42)
14.04 unity et Linux Mint KDE 13 zsh-meilleur shell script fire
Hors ligne
#10 Le 08/01/2013, à 22:03
- Hizoka
Re : script if où est l'erreur
perso je fais ca : (ex avec kate)
ps ax | grep "kate" | grep -v "grep"
=> 21592 ? Sl 0:01 /usr/bin/kate -b /home/hizoka/hizo
et si pas d'instance, ca ne renvoie rien et le code retour est 1
Dernière modification par Hizoka (Le 08/01/2013, à 22:04)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#11 Le 08/01/2013, à 22:53
- pingouinux
Re : script if où est l'erreur
@Hizoka #10 :
Le problème, c'est que lorsqu'on lance un script, le nom de la commande est bash, et pas le nom du script (d'après les tests que je viens de faire).
Rectificatif : Ce que tu proposes marche si on lance le script ainsi : bash -c nom_du_script
On peut aussi envisager quelque chose comme ça, mais on peut sans doute simplifier.
# En tête du script
rm_verrou() { rm /tmp/verrou_$$; trap '' EXIT; exit; }
trap rm_verrou TERM EXIT
for verrou in /tmp/verrou_*
do
[ -f "$verrou" ] && { kill INT ${verrou#*_} 2>/dev/null || rm $verrou; }
done
touch /tmp/verrou_$$
# Le script est ici
.........................
Dernière modification par pingouinux (Le 08/01/2013, à 23:37)
Hors ligne
#12 Le 08/01/2013, à 23:42
- Hizoka
Re : script if où est l'erreur
cat cacaca
#!/bin/bash
read -p "cacaca"
si je lance via ./cacaca
ps ax | grep "cacaca" | grep -v "grep"
22956 pts/3 S+ 0:00 /bin/bash ./cacaca
si je lance via bash cacaca
ps ax | grep "cacaca" | grep -v "grep"
23020 pts/3 S+ 0:00 bash cacaca
au final c'est toujours trouvable non ?
Sinon on peut toujours utiliser pstree à la place de ps non ?
Mais via un fichier temporaire, c'est en effet ce qu'il y a de plus simple.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#13 Le 09/01/2013, à 00:01
- pingouinux
Re : script if où est l'erreur
@Hizoka :
C'est curieux, voici ce que j'obtiens.
$ cat mon_script
sleep 20
$ ./mon_script
Dans une autre fenêtre
$ ps ax | grep "mon_script" | grep -v "grep"
et avec
$ bash ./mon_script
$ ps ax | grep "mon_script" | grep -v "grep"
8096 pts/4 S+ 0:00 bash ./mon_script
Mon environnement :
Ubuntu 12.04.1 LTS
GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu)
Ajouté :
Comme ceci, ça marche :
$ cat mon_script
#!/bin/bash
sleep 20
$./mon_script
$ ps ax | grep "mon_script" | grep -v "grep"
8157 pts/4 S+ 0:00 /bin/bash ./mon_script
Dernière modification par pingouinux (Le 09/01/2013, à 00:06)
Hors ligne
#14 Le 09/01/2013, à 02:44
- Hizoka
Re : script if où est l'erreur
ouais il faut donc que le script indique qu'il utilise bash
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#15 Le 11/01/2013, à 16:04
- omnimax
Re : script if où est l'erreur
Encore merci pour vos contributions.
Voici donc la bestiole
J'ai essayé d'imaginer tous les cas de figures
>stopper l'instance du script si elle est en cours
> renvoyer une erreur sous forme de fichier sur le bureau si le réseau est HS (je suis un afficionado du bureau vide, donc je le verrai)
> jouer une musique lorsque la copie est terminée et placer ma commande en
commande 1
commande 2
afin que si ma commande musique renvoie une erreur alors le reste du script s'exécute qd même
>supprimer tous mes petits fichier sur le bureau dès qu'une nouvelle instance sera lancée.
Merci de me faire part de vos commentaires ou suggestions et bonne journée.
#!/bin/sh
#şcript DOCI
export LANG="fr_BE.UTF-8"
#VARIABLES
TXTMAILOK="fichier monté"
EMPLACEMENT="/home/$USER/Téléchargements"
MUSIK="mamusiqued'avertissement"
DESTINATION="/media/madestination/"
TXTOK="it's ok"
ADRESSEMAIL="monmail@gmail.com"
TXTERREURRESEAU="erreur réseau"
#VERIFIER SI INSTANCE
instance=ps ax |grep "tos"|grep -v "grep"
if [ $instance -ne 1 ]; then
#SUPPRESSION DES TXT SUR BUREAU AU CAS OU RESEAU NE FONCTIONNE PAS ET MUSIK NE FONCTIONNE PAS
if [ "$TXTOK" -e ]; then
rm /home/$USER/Bureau/"$TXTOK"
fi
if [ "$TXTERREURRESEAU" -e ]; then
rm /home/$USER/Bureau/"$TXTERREURRESEAU"
fi
#SCRIPT PROPREMENT DIT
fichier=$(ls "$EMPLACEMENT"/*.part|wc -l)
if [ "$fichier" -gt 0 ]; then
echo "ok"
else
mplayer /home/$USER/"$MUSIK"
cp ~/Téléchargements/* "$DESTINATION" && touch /home/$USER/Bureau/"$TXTOK"
#VERIFICATION DU RESEAU
if [ echo "$TXTMAILOK" | msmtp "$ADRESSEMAIL" -eq 1 ]; then
touch /home/$USER/Bureau/"$TXTERREURRESEAU"
else
echo "$TXTMAILOK" | msmtp "$ADRESSEMAIL"
fi
fi
fi
exit 0
Dernière modification par greg2007 (Le 11/01/2013, à 21:12)
14.04 unity et Linux Mint KDE 13 zsh-meilleur shell script fire
Hors ligne
#16 Le 11/01/2013, à 16:07
- shoot76
Re : script if où est l'erreur
Je suis plus un adepte du case que des if à la suite. mais ça me parait pas mal déjà
~ Data-sientist freelance : https://skulder.fr
Hors ligne
#17 Le 11/01/2013, à 16:11
- omnimax
Re : script if où est l'erreur
oui c'est vrai que c'est plus dur à s'y retrouver du coup
14.04 unity et Linux Mint KDE 13 zsh-meilleur shell script fire
Hors ligne
#18 Le 11/01/2013, à 17:52
- pingouinux
Re : script if où est l'erreur
Bonjour,
@greg2007 #15 :
À l'utilisation, mettre les variables entre " " pour que les espaces éventuels soient traités correctement.
Par exemple :
cp ~/Téléchargements/* "$DESTINATION" && touch "/home/$USER/Bureau/$TXTOK"
Ajouté : Il y a plusieurs commandes qui ne fonctionneront pas dans ton script. Tu as intérêt à l'écrire petit à petit et à faire des exécutions partielles pour corriger les erreurs.
Dernière modification par pingouinux (Le 11/01/2013, à 19:39)
Hors ligne
#19 Le 11/01/2013, à 20:14
- omnimax
Re : script if où est l'erreur
Ok , c'est noté pingouinux, je change toutes mes variables suivant tes conseils.
1.je me demandais justement s'il n'y avait pas une possibilité de tester un code virtuellement sans effectuer les actions ?
2.Je ne te demande pas de vérifier tout mon script mais est-ce que cette action
si le fichier txtok est présent alors tu le supprimes sinon tu ne fais rien et tu continues le script est correcte ?
if [ $TXTOK -e ]; then
rm /home/$USER/Bureau/"$TXTOK"
fi
3.pour case
case variable in
modèle [ | modèle] ...) instructions;;
modèle [ | modèle] ...) instructions;;
...
esac
esac correspond en gros au fi de la fonction if ?
Par contre, je souhaiterai encore améliorer mon script.
4. déjà en faisant cp /* c'est un peu lourd, non ?
ne vaudrait-il pas mieux faire un boucle
for part in $fichier; do
cp "$fichier" "$emplacement"
done
5. je souhaiterai modifier mon cp par un mv, mais il faudrait qu'en cas de pépin ou par exemple si je décide volontairement de mettre fin au script que le fichier ne soit pas perdu. J'ai vu l'option
mv -b
pour faire un backup mais cela n'a pas l'air de fonctionner chez moi...
6.enfin je souhaiterai déplacer mes fichiers à la volée, je m'explique si mon ls
donne
fichier1.part
fichier1
fichier2.part
fichier2
et que si le fichier 1 est prêt, je puisse déjà le déplacer sans attendre que tous les *.part soient partis
fichier1
fichier2.part
fichier2
je crois que c'est possible via un tableau mais je coince au niveau de la syntaxe, si vous pouviez me donner une piste, ce serait sympa.
tab=("John Smith" "Jane Doe")
Dernière modification par greg2007 (Le 11/01/2013, à 20:47)
14.04 unity et Linux Mint KDE 13 zsh-meilleur shell script fire
Hors ligne
#20 Le 11/01/2013, à 20:52
- pingouinux
Re : script if où est l'erreur
Réponses à quelques unes de tes questions :
1) Il est possible de mettre un echo devant les commandes
2)
if [ -e "$TXTOK" ]; then
rm /home/$USER/Bureau/"$TXTOK"
fi
ou
[ -e "$TXTOK" ] && rm /home/$USER/Bureau/"$TXTOK"
3)
esac correspond en gros au fi de la fonction if ?
Oui
5) L'option -b de mv fait un backup du fichier de destination, s'il existe déjà
Hors ligne
#21 Le 11/01/2013, à 21:09
- omnimax
Re : script if où est l'erreur
Merci, encore une chose en plus d'apprise
Par contre je me rends compte que je me plante royalement en faisant mon test de réseau qui dit : si la commande d'envoi de mail est strictement égal à 1alors tu produits un fichier erreur réseau sinon tu envoies le mail
En fait il est impossible de savoir si la commande renvoie 1 ou 0 puisque la commande doit être lancée préalablement >>> ma syntaxe n'est pas bonne et j'ai des erreurs . Comment fait-on dans ce cas si on ne sait pas mettre de condition ?
#VERIFICATION DU RESEAU
if [ echo $TXTMAILOK | msmtp $ADRESSEMAIL -eq 1 ]; then
touch /home/$USER/Bureau/$TXTERREURRESEAU
else
echo $TXTMAILOK | msmtp $ADRESSEMAIL
fi
Dernière modification par greg2007 (Le 11/01/2013, à 21:13)
14.04 unity et Linux Mint KDE 13 zsh-meilleur shell script fire
Hors ligne
#22 Le 11/01/2013, à 23:07
- omnimax
Re : script if où est l'erreur
une rustine..:( pas top mais ça marche
Mais encore un fichier à supprimer en début de script (fichier ok)
echo "$TXTMAILOK" | msmtp "$ADRESSEMAIL" && touch "$EMPLACEMENT"/ok
[ ! -e ""$EMPLACEMENT"/ok" ] && touch /home/$USER/Bureau/"$TXTERREURRESEAU"
Dernière modification par greg2007 (Le 11/01/2013, à 23:09)
14.04 unity et Linux Mint KDE 13 zsh-meilleur shell script fire
Hors ligne
#23 Le 11/01/2013, à 23:13
- pingouinux
Re : script if où est l'erreur
Ceci peut-il convenir ?
echo "$TXTMAILOK" | msmtp "$ADRESSEMAIL" || touch /home/$USER/Bureau/"$TXTERREURRESEAU"
ou
msmtp "$ADRESSEMAIL" <<<"$TXTMAILOK" || touch /home/$USER/Bureau/"$TXTERREURRESEAU"
Hors ligne
#24 Le 12/01/2013, à 11:18
- omnimax
Re : script if où est l'erreur
#!/bin/sh
#script tos
export LANG="fr_BE.UTF-8"
#VARIABLES EMPLACEMENTS
EMPLACEMENT=/home/$USER/Téléchargements
DESTINATION=/media/
FICHIERORIGINE="$(ls "$EMPLACEMENT"/*|wc -l)"
#VARIABLES DIVERS
ADRESSEMAIL="MAIL@gmail.com"
MUSIK="mamusique"
#VARIABLES MESSAGES
TXTMAILOK="fichier monté"
TXTOK="it's ok"
TXTERREURRESEAU="erreur réseau"
TXTERREURCOPIE="erreur copie"
#VERIFIER SI INSTANCE EN COURS
instance=ps ax |grep "tos"|grep -v "grep"
if [ "$instance" -ne 1 ]; then
#SUPPRESSION DES TXT SUR BUREAU AU CAS OU RESEAU, MUSIK, COPIE NE FONCTIONNE PAS
[ -e /home/$USER/Bureau/"$TXTOK" ] && rm /home/$USER/Bureau/"$TXTOK"
[ -e /home/$USER/Bureau/"$TXTERREURRESEAU" ] && rm /home/$USER/Bureau/"$TXTERREURRESEAU"
[ -e /home/$USER/Bureau/"$TXTERREURCOPIE" ] && rm /home/$USER/Bureau/"$TXTERREURCOPIE"
#SCRIPT PROPREMENT DIT
fichier=$(ls "$EMPLACEMENT"/*.part|wc -l)
if [ "$fichier" -gt 0 ]; then
echo "ok"
else
mplayer /home/$USER/"$MUSIK"
for DOWNLOADS in "$EMPLACEMENT"/*;
do
cp "$DOWNLOADS" "$DESTINATION" && rm rm ~/Téléchargements/*
;done
#TXT
[ "$FICHIERORIGINE" -eq 0 ] && touch /home/$USER/Bureau/"$TXTOK"
[ -e /home/$USER/Bureau/"$TXTOK" ] || touch /home/$USER/Bureau/"$TXTERREURCOPIE"
#VERIFICATION DU RESEAU +TXT
echo "$TXTMAILOK" | msmtp "$ADRESSEMAIL" || touch /home/$USER/Bureau/"$TXTERREURRESEAU"
fi
fi
exit 0
Oui c'est parfait
Pour la boucle je copie puis && rm, j'ai testé dans un terminal cela fonctionne.
Mais l'idéal serait de pouvoir copier les fichiers dès que l'extension part a disparue.
Dernière modification par greg2007 (Le 12/01/2013, à 12:08)
14.04 unity et Linux Mint KDE 13 zsh-meilleur shell script fire
Hors ligne
#25 Le 14/01/2013, à 21:43
- omnimax
Re : script if où est l'erreur
#!/bin/sh
#script tos
export LANG="fr_BE.UTF-8"
#VARIABLES EMPLACEMENTS
EMPLACEMENT=/home/$USER/Téléchargements
DESTINATION=/media/
FICHIERORIGINE="$(ls "$EMPLACEMENT"/*|wc -l)"
#VARIABLES DIVERS
ADRESSEMAIL="mail@gmail.com"
MUSIK=/home/$USER/
INSTANCE=$(pgrep tos | wc -l)
#VARIABLES MESSAGES
TXTMAILOK="fichiers montés"
TXTOK="it's ok"
TXTERREURRESEAU="erreur réseau"
TXTERREURCOPIE="erreur c"
if [ "$FICHIERORIGINE" -gt 0 ]; then
if [ "$INSTANCE" -le 1 ]; then
#SUPPRESSION DES TXT SUR BUREAU AU CAS OU RESEAU, MUSIK, COPIE NE FONCTIONNE PAS
[ -e /home/$USER/Bureau/"$TXTOK" ] && rm /home/$USER/Bureau/"$TXTOK"
[ -e /home/$USER/Bureau/"$TXTERREURRESEAU" ] && rm /home/$USER/Bureau/"$TXTERREURRESEAU"
[ -e /home/$USER/Bureau/"$TXTERREURCOPIE" ] && rm /home/$USER/Bureau/"$TXTERREURCOPIE"
#SCRIPT PROPREMENT DIT
fichier=$(ls "$EMPLACEMENT"/*.part|wc -l)
if [ "$fichier" -gt 0 ]; then
echo "ok"
else
mplayer "$MUSIK" 2>/dev/null
for DOWNLOADS in "$EMPLACEMENT"/*;
do
cp "$DOWNLOADS" "$DESTINATION"
rm "$DOWNLOADS"
done
#TXT
[ "$FICHIERORIGINE" -eq 0 ] && touch /home/$USER/Bureau/"$TXTOK"
[ -e /home/$USER/Bureau/"$TXTOK" ] || touch /home/$USER/Bureau/"$TXTERREURCOPIE"
#VERIFICATION DU RESEAU +TXT
[ -e /home/$USER/Bureau/"$TXTOK" ] && echo "$TXTMAILOK" | msmtp "$ADRESSEMAIL" || touch /home/$USER/Bureau/"$TXTERREURRESEAU"
fi
fi
fi
exit 0
Dernière modification par greg2007 (Le 14/01/2013, à 22:11)
14.04 unity et Linux Mint KDE 13 zsh-meilleur shell script fire
Hors ligne