Votre navigateur est obsolète. Téléchargez un navigateur moderne, par exemple FireFox.
Léa-Linux : Forum
Le forum de Léa abrite des discussions autour des Logiciels libres.
Syndication
  • RSS ForumForum complet
  • RSS Forum - DéveloppementForum - Développement
  • RSS Forum - Développement - 298584Cette discussion

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.

Important : quand vous posez une question, n'oubliez pas de nous donner les indications suffisantes pour que nous puissions répondre. En effet, la divination n'est pas le fort du Linuxien averti. Pour une meilleure compréhension, le bon usage de la grammaire et de l'orthographe est fortement encouragé. En particulier, le langage SMS est à éviter absolument. En cas d'abus, il pourra être censuré sans autre forme de procès.
Les messages dont le contenu est illégal (incitant à la haine - raciale ou autre, diffamant), ou dont le contenu est sans rapport avec le sujet du forum, ou qui sont parfaitement stupides ou hors sujet seront supprimés sans pitié. Il pourra même être fait appel au fournisseur d'accès du coupable pour faire cesser ses agissements.
» Index du forum » Développement » [Aide] : cron + bash ...
Aller à la discussion: PrécédentSuivante
Action: Nouveau sujetChercherS'authentifier
[Aide] : cron + bash ...
Auteur: guillaumeH (IP enregistrée)
Date: le 10 juillet 2006 à 21:09

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.

Re: [Aide] : cron + bash ...
Auteur: Basile STARYNKEVITCH (IP enregistrée)
Date: le 10 juillet 2006 à 23:05

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


----

Basile STARYNKEVITCH où on trouve mon mél

N.B. N'hesitez pas à consulter aussi mes contributions antérieures.

Re: [Aide] : cron + bash ...
Avatar
Auteur: Léa (Fred) (IP enregistrée)
Date: le 11 juillet 2006 à 08:39

Tu peux commencer par ces documentations :

Fred --
jeune padawan

Re: [Aide] : cron + bash ...
Auteur: ethneo (IP enregistrée)
Date: le 11 juillet 2006 à 20:01

#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]

Re: [Aide] : cron + bash ...
Auteur: guillaumeH (IP enregistrée)
Date: le 18 juillet 2006 à 18:10

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

Re: [Aide] : cron + bash ...
Avatar
Auteur: Sve@r (IP enregistrée)
Date: le 18 juillet 2006 à 19:26

guillaumeH a écrit :

Connaissez vous un bon site pour apprendre le bash ?

[fr.lang.free.fr]

guillaumeH a écrit :

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


guillaumeH a écrit :

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]

Re: [Aide] : cron + bash ...
Avatar
Auteur: Léa (Fred) (IP enregistrée)
Date: le 20 juillet 2006 à 13:28

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.

Fred --
jeune padawan

Re: [Aide] : cron + bash ...
Auteur: guillaumeH (IP enregistrée)
Date: le 27 juillet 2006 à 12:36

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.

Re: [Aide] : cron + bash ...
Avatar
Auteur: Sve@r (IP enregistrée)
Date: le 28 juillet 2006 à 14:05

guillaumeH a écrit :


# 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
...


guillaumeH a écrit :

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...

guillaumeH a écrit :

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]

Re: [Aide] : cron + bash ...
Auteur: guillaumeH (IP enregistrée)
Date: le 30 juillet 2006 à 17:03

Ok :) 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

Re: [Aide] : cron + bash ...
Avatar
Auteur: Sve@r (IP enregistrée)
Date: le 31 juillet 2006 à 15:01

guillaumeH a écrit :

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]

Re: [Aide] : cron + bash ...
Auteur: guillaumeH (IP enregistrée)
Date: le 18 septembre 2006 à 19:47

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

Re: [Aide] : cron + bash ...
Avatar
Auteur: Sve@r (IP enregistrée)
Date: le 18 septembre 2006 à 20:30

guillaumeH a écrit :

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]

Re: [Aide] : cron + bash ...
Auteur: guillaumeH (IP enregistrée)
Date: le 18 septembre 2006 à 23:57

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.. image : moue

merci


Re: [Aide] : cron + bash ...
Avatar
Auteur: Sve@r (IP enregistrée)
Date: le 22 septembre 2006 à 04:20

guillaumeH a écrit :

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]

Re: [Aide] : cron + bash ...
Auteur: guillaumeH (IP enregistrée)
Date: le 26 septembre 2006 à 18:22

Sve@r a écrit :


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 :D
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..

Re: [Aide] : cron + bash ...
Avatar
Auteur: Sve@r (IP enregistrée)
Date: le 26 septembre 2006 à 23:13

guillaumeH a écrit :

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 :D

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]

Re: [Aide] : cron + bash ...
Auteur: guillaumeH (IP enregistrée)
Date: le 27 septembre 2006 à 15:32

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.. image : moue

Re: [Aide] : cron + bash ...
Avatar
Auteur: Sve@r (IP enregistrée)
Date: le 27 septembre 2006 à 22:05

guillaumeH a écrit :

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]



Nom du forum : (antispam) - (en développement:saisir un texte pour le message, rempli cette zone automatiquement)
Votre nom: 
Votre email: 
Sujet: 

 
Ce forum est boosté par Phorum.