Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
[Aide] : cron + bash ...
Envoyé par: guillaumeH

Bonjour à tous,

Je viens demander de l'aide pour programmer un script bash.
Je voudrais qu'il aille dans un repertoire précis, puis qu'il lance un logiciel (un convertisseur video pour mon cas).
Le probleme c'est que je voudrais qu'il le fasse de lui meme toutes les X minutes par exemple.
J'ai entendu parler de cron sous linux ?

Pouvez-vous m'éclairer ? des liens ?

Merci pour votre aide.

Poste le Monday 10 July 2006 21:09:46
Répondre     Citer    
Re: [Aide] : cron + bash ...

Lis le man de crontab (section 1 et section 5).


----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Monday 10 July 2006 23:05:15
Répondre     Citer    
Re: [Aide] : cron + bash ...
Envoyé par: Léa (Fred)

Tu peux commencer par ces documentations :
* [lea-linux.org]
* [lea-linux.org]
* [lea-linux.org]

Poste le Tuesday 11 July 2006 08:39:19
Répondre     Citer    
Re: [Aide] : cron + bash ...
Envoyé par: ethneo

#contab -e
tu aura un editeur VI

tu peux rentrer des lignes apres par exemple :
30 23 * * * /home/user/script-de-ouf.sh >>/tmp/log_s.log
// Tous les jours à 23h30
lis le man pour comprendre.

Et ton script.sh poura contenir :
#!/bin/sh
vlc -[arguments..]
(si tu utilise vlc par exemple)


_________________
Linux, sécurité, & Co. ... [ethneo.free.fr]

Poste le Tuesday 11 July 2006 20:01:22
Répondre     Citer    
Re: [Aide] : cron + bash ...
Envoyé par: guillaumeH

ok merci de ton aide ethneo .
Par contre Fred le lien que tu m'a donné sur léa (prog bash) ne me concerne pas. je ne veux pas faire de boite de dialogue..
Connaissez vous un bon site pour apprendre le bash ?

Dernière question, j'ai codé ca, pouvez vous me dire si c'est bon ?
#!/bin/sh

for fichier in /home/videos/ *
do
(vlc....)
echo 'video converti avec success !'
done

le but de ce bout de prog étant de aller convertir avec VLC chaque fichier présent dans /home/videos/, et d'afficher "success" si il a réussi.

Merci de vos commentaires

Poste le Tuesday 18 July 2006 18:10:25
Répondre     Citer    
Re: [Aide] : cron + bash ...
Envoyé par: Sve@r

Citation
guillaumeH
Connaissez vous un bon site pour apprendre le bash ?
[fr.lang.free.fr]

Citation
guillaumeH
Dernière question, j'ai codé ca, pouvez vous me
dire si c'est bon ?
#!/bin/sh

for fichier in /home/videos/ *
do
(vlc....)
echo 'video converti avec success !'
done

le but de ce bout de prog étant de aller convertir
avec VLC chaque fichier présent dans
/home/videos/, et d'afficher "success" si il a
réussi.
Ton script ne fait pas ce que tu décris. Il affiche "success" dans tous les cas (c'est à dire même si la conversion n'a pas réussie)
Pour afficher "success" si la commande "vlc" a réussie, il te faut vérifier que le code de retour de cette commande est égal à 0. Ce code étant stocké dans la variable "$?", il te faut vérifier la valeur de cette variable. Personnellement j'ai l'habitude de stocker immédiatement la valeur de cette variable après la commande qui m'intéresse car cette variable est réinitialisée après chaque commande (c'est à dire que si tu fais un "echo" juste après "vlc", ta variable "$?" remplace le statut de "vlc" par celui du "echo")
Exemple
vlc ...; statut=$?
...<autre chose>
if test $statut -eq 0
then
____echo "vlc success"
else
____echo "vlc raté"
fi

Si la vérif se fait immédiatement après vlc, on peut raccourcir
if vlc ...
then
____echo "vlc success"
else
____echo "vlc raté"
fi

Citation
guillaumeH
for fichier in /home/videos/ *
do
Tu veux sans doute dire "for fichier in /home/videos/*" (pas d'espace entre "/" et "*" car cela symbolise un nom de fichier commençant par "/home/videos/" et finissant par n'importe quoi)
Le pb de cette structure, c'est que si tu as un fichier contenant un espace dans son nom (c'est con mais possible), ton "for" fera 2 itérations (le "for" utilise l'espace pour séparer ses éléments) et aucune des 2 itérations n'aura le bon nom de fichier.

Pour résoudre ce pb, on peut utiliser une boucle sur commande "read". En effet, le "read" arrête sa lecture à chaque "retour charriot" et renvoie un statut "faux" quand il n'y a plus rien à lire
Donc cela donne le truc suivant
ls /home/videos/* |while read fichier
do
...
done
Tout le contenu du "ls" est stocké dans le pipe. Puis, le read vient tranquillement piocher dedans chaque ligne (donc chaque nom) et la boucle "while" tourne. Quand le pipe est vide, "read" renvoie faux donc le "while" s'arrête. Simple et efficace. Seul pb: si tu remplis une variable (style un compteur) dans le do...done, tu la perds à la fin du done (hé oui, pipe => sous-processus). Il y a des moyens plus complexes pour résoudre ce genre de pb mais on en parlera plus tard...





L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Tuesday 18 July 2006 19:26:03
Répondre     Citer    
Re: [Aide] : cron + bash ...
Envoyé par: Léa (Fred)

J'ai pas donné UN lien, mais TROIS lien, chacun donne des pistes de programmation en bash et de la crontab. Le dernier est sur dialog, l'intérêt de celui-là est qu'il contient des exemples de script.

Poste le Thursday 20 July 2006 13:28:38
Répondre     Citer    
Re: [Aide] : cron + bash ...
Envoyé par: guillaumeH

Merci beaucoup Sve@r.
J'ai commencé à lire ton cours sur le shell.

Si j'ai bien tout compris,

#!/bin/sh

# boucle lisant chaque fichier
ls /home/videos/* | while read fichier  
do

# la commande a faire pour chaque fichier
vlc ...

# est-ce que le programme a terminé correctement
statut=$?
if test $statut -eq 0
then echo "ok tout va bien"
else echo "probleme"
fi
done

petite question :
pour le "while read fichier" : on ne doit pas définir le type "fichier" (je réfléchis comme en C par exemple : FILE * fichier) ?

Il est surement possible de l'optimiser, mais bon ya a peine 10 lignes alors je sais pas si ça vaut le coup ?
Merci.

Poste le Thursday 27 July 2006 12:36:58
Répondre     Citer    
Re: [Aide] : cron + bash ...
Envoyé par: Sve@r

Citation
guillaumeH
# la commande a faire pour chaque fichier
vlc ...

# est-ce que le programme a terminé correctement
statut=$?
Danger. La variable "$?" récupère automatiquement (donc tu peux rien y faire) l'état de la dernière commande exécutée.
Imagine que, dans un soucis de débug, tu mettes un simple "echo" entre "vlc" et "statut=$?", tu récupères alors l'état du "echo" et t'as perdu celui de "vlc".
# la commande a faire pour chaque fichier
vlc ...; statut=$?      # On met l'affectation sur la même ligne

# est-ce que le programme a terminé correctement
if test $statut -eq 0
...

Citation
guillaumeH
petite question :
pour le "while read fichier" : on ne doit pas
définir le type "fichier" (je réfléchis comme en C
par exemple : FILE * fichier) ?
Non. La syntaxe "read xxx" lit l'entrée standard et la stocke dans la variable "xxx". Là, l'entrée standard est issue du pipe qui reçoit le contenu du "ls" donc ta commande "read" lit un nom de fichier. Ce nom est stocké dans une variable nommée "fichier" car c'est ce qu'il y a de plus logique...

Citation
guillaumeH
Il est surement possible de l'optimiser, mais bon
ya a peine 10 lignes alors je sais pas si ça vaut
le coup ?
Merci.
Tu peux remplacer
vlc ...; statut=$?
if test $statut -eq 0
par
if vlc ...
En effet, "if" veut impérativement une commande. On emploie couramment le "if test" car la commande "test" permet de tester plein de trucs mais ce n'est pas obligatoire. La seule obligation est que ce qu'il y a après le "if" soit une commande Unix valide qui renvoie "0" quand tout s'est bien passé et une autre valeur (peu importe) quand il y a eu un pb. Tu peux même créer un script shell "toto.sh" qui respecte cette règle et écrire ensuite "if toto.sh ..."

L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Friday 28 July 2006 14:05:53
Répondre     Citer    
Re: [Aide] : cron + bash ...
Envoyé par: guillaumeH

Ok smiling smiley MERci bcp. C'est très interessant "l'astuce" pour le if.

donc mon code ressemble à ça (j'ai utilisé le if, je gagne une comparaison au niveau du temps)
#!/bin/sh
ls /home/videos/* | while read fichier  
do
if vlc... 
then echo"ok"
else echo "probleme"
fi
done

Petite question : il ne devrait pas y avoir de problème de droits, pour lister des répertoires et ecrire dans d'autres, le contab devrait avoir les droits suffisant pour faire cela, ou bien il faut que je chmod mon sh ?
Merci

Poste le Sunday 30 July 2006 17:03:25
Répondre     Citer    
Re: [Aide] : cron + bash ...
Envoyé par: Sve@r

Citation
guillaumeH
Petite question : il ne devrait pas y avoir de
problème de droits, pour lister des répertoires et
ecrire dans d'autres, le contab devrait avoir les
droits suffisant pour faire cela, ou bien il faut
que je chmod mon sh ?Merci

1) faire un "chmod" sur ton script ne lui donnera pas plus de droits. Les droits d'un fichier indiquent juste quels sont les accès autorisés sur fichier (lecture, modif, exécution) et à qui tu les donne (toi, ceux de ton groupe ou les autres).

2) une tâche programmée dans le cron aura les mêmes droits que l'utilisateur qui a programmé la tâche


L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Monday 31 July 2006 15:01:51
Répondre     Citer    
Re: [Aide] : cron + bash ...
Envoyé par: guillaumeH

Salut,
Je reviens avec un dernier ptit problème :/
lorsque le lance mon "ls -R /home/videos/* | while read fichier"
(car mes videos sont dans des sous repertoires) il prend en compte le repertoire comme un fichier et donc forcement j'ai droit a une erreur (ce n'est pas une video..)

Malgré la lecture du man ls, je ne sais pas comment faire lire seulement les fichiers ?
Merci

Poste le Monday 18 September 2006 19:47:09
Répondre     Citer    
Re: [Aide] : cron + bash ...
Envoyé par: Sve@r

Citation
guillaumeH
Salut,
Je reviens avec un dernier ptit problème :/
lorsque le lance mon "ls -R /home/videos/* | while
read fichier"
(car mes videos sont dans des sous repertoires) il
prend en compte le repertoire comme un fichier et
donc forcement j'ai droit a une erreur (ce n'est
pas une video..)

Malgré la lecture du man ls, je ne sais pas
comment faire lire seulement les fichiers ?
Merci
ls ne fait pas tout. Il faut aussi un peu programmer de ton coté... Pour ton pb, il te suffit de filtrer dans ta boucle, tout ce qui n'est pas fichier...
ls -R /home/videos/* |while read fichier
do
....# Elimination de tout ce qui n'est pas fichier
....test ! -f "$fichier" && continue

....# Ici, on est certain que "$fichier" est bien un fichier
....<suite du code>
done

Eventuellement, on peut utiliser "file" pour éliminer tous les fichiers qui ne sont pas vidéo (voir le man), ce qui devrait être un truc du style
# Elimination de tout fichier ne contenant pas le mot "video" dans sa description
file "$fichier" |grep "video" 1>/dev/null || continue

L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Monday 18 September 2006 20:30:40
Répondre     Citer    
Re: [Aide] : cron + bash ...
Envoyé par: guillaumeH

ok merci je pensais que cela se jouait du coté du 'ls' désolé..
J'ai donc qqchose comme :

ls -R /home/videos/* | while read fichier
do

file "$fichier" |grep "video" 1>/dev/null || if /usr/bin/ffmpeg -i "$fichier" (...) sortie.mpg

then echo "Conversion du fichier $fichier réussi."

else echo "Probleme de conversion du fichier $fichier"
fi

mais ca ne marche pas, la commande est bien lancé pour uniquement les fichiers vidéo mais il doit y a avoir un probleme avec la variable $fichier car il me dit qu'il ne trouve pas le fichier.. :-/

merci


Poste le Monday 18 September 2006 23:57:08
Répondre     Citer    
Re: [Aide] : cron + bash ...
Envoyé par: Sve@r

Citation
guillaumeH
J'ai donc qqchose comme :

ls -R /home/videos/* | while read fichier
do

file "$fichier" |grep "video" 1>/dev/null || if
/usr/bin/ffmpeg -i "$fichier" (...) sortie.mpg

then echo "Conversion du fichier $fichier
réussi."

else echo "Probleme de conversion du fichier
$fichier"
fi
mais il doit y avoir un probleme avec la variable $fichier car il me dit qu'il ne trouve pas le fichier..

merci

Remplace "file $fichier" par "file /home/videos/$fichier". Et fait gaffe car apparemment, ta boucle écrira chaque vidéo dans un unique fichier nommé "sortie.mpeg" !!!


L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Friday 22 September 2006 04:20:25
Répondre     Citer    
Re: [Aide] : cron + bash ...
Envoyé par: guillaumeH

Citation
Sve@r
Remplace "file $fichier" par "file /home/videos/$fichier".

merci encore pour ta réponse!
Le probleme est, comme tu peux voir j'ai des repertoire recursifs a traiter (ls -R) donc je ne connais pas par avance le repertoire exact de la video a traiter. c.a.d ça peut etre /home/videos/policier/video.avi puis /home/videos/humour/film.avi etc..
je suis chiant grinning smiley
J'ai testé avec $PWD pour se placer dans le repertoire mais ca me renvoi le repertoire d'ou j'ai lancé le script :/

Merci..

Poste le Tuesday 26 September 2006 18:22:04
Répondre     Citer    
Re: [Aide] : cron + bash ...
Envoyé par: Sve@r

Citation
guillaumeH
Le probleme est, comme tu peux voir j'ai des repertoire recursifs a traiter (ls -R)
T'as raison, j'avais pas fait attention au "-R"

donc je ne connais pas par avance le repertoire exact de la
video a traiter. c.a.d ça peut etre
/home/videos/policier/video.avi puis
/home/videos/humour/film.avi etc..
je suis chiant grinning smiley
Non non, pas de pb - Remplace "ls -R /home/video/* |while read fichier" par
find /home/video -type f -print |while read fichier
Et remet "file $fichier" comme c'était au début et là, ça (devrait) marcher.

L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Tuesday 26 September 2006 23:13:59
Répondre     Citer    
Re: [Aide] : cron + bash ...
Envoyé par: guillaumeH

merciiiii !!!!
ca marche mieux avec le find =)

Mais le 1er fichier du 1er repertoire est bien encodé, mais depuis le "find..." il s'arrete apres le 1er justement, il ne continue pas dans les autres repertoires.. :-/

Poste le Wednesday 27 September 2006 15:32:48
Répondre     Citer    
Re: [Aide] : cron + bash ...
Envoyé par: Sve@r

Citation
guillaumeH
Mais le 1er fichier du 1er repertoire est bien encodé, mais depuis le "find..." il s'arrete apres le 1er justement, il ne continue pas dans les
autres repertoires..
Là j'en sais rien. faut un peu que tu te débrouilles tout seul. Mets du "echo $fichier" juste après le "do" histoire de voir le nom du fichier que tu vas traiter. Encadre les instructions qui te semblent douteuses par un "set +x" avant la première instruction et un "set -x" après la dernière. Toutes tes instructions encadrées seront affichées avant d'être exécutées. Ca doit être un truc tout con qui fait que ça marche pas. D'ailleurs, en relisant mon code un peu plus haut, je vois que j'avais écrit :
# Elimination de tout fichier ne contenant pas le mot "video" dans sa description
file "$fichier" |grep "video" 1>/dev/null || continue
Ce qui signifie
<< si la recherche du mot "video" dans la description du fichier échoue (sous-entendu 'si le mot "video" n'y est pas') alors passe au fichier suivant (sous-entendu "arrête de travailler ce fichier") >>

En regardant ton code, je vois que t'as écrit
file "$fichier" |grep "video" 1>/dev/null || if /usr/bin/ffmpeg -i "$fichier" (...) sortie.mpg
Ce qui signifie
<< si la recherche du mot "video" dans la description du fichier échoue (sous-entendu 'si le mot "video" n'y est pas') alors converti ce fichier (qui n'est pourtant pas une vidéo !!!) >>

Remplace "||" par "&&" dans ta ligne et retourne étudier les connecteurs booléens shell...

L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Wednesday 27 September 2006 22:05:07
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
[Aide] : cron + bash ...
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons