Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 10/06/2006, à 00:42

mamourbizbiz

script?

Bonjour,

j'aimerai avoir quelques information sur les scripts: language utilisé et autre formalisme
je n'y connais pas grans chose en programmation et pourtant ça m'interesse
si quelqu'un avez une doc qui rassemble les fonctions utile (les bases quoi) dans un scrypt



j'ai pris ce script sur le forum il a etai redigé par thom que je remercie

il permet de changer de fond d'ecran toute les heures

mais j aimerais le comprendre pour pouvoir le modifier (j'aimerai ajouter une commande qui redemmarre adesklet apres chaque changement de fond d ercran et reduire le tps de changement genre passer a 15 min au lieu d'une heure)


Code:

#! /bin/bash
## dependances : randomize-lines
gconftool -t str -s /desktop/gnome/background/picture_filename "`find $HOME/media/images/ -name \*.jpg | rl | tail -n 1`"

si quelqu'un pouvai me docummenter ce serai sympa


Merci smile


ouai windows c'est pour les nuls...heu... comment ca marche ubuntu?

Hors ligne

#2 Le 10/06/2006, à 02:17

snapshot

Re : script?

C'est pas encore un script, vu qu'il ne fait qu'une ligne smile
C'est plutot du shell, tu peux avoir plein d'info sur le shell ici :
http://www.bsdbooks.net/shells/scripting/fr/

Mais voila quand même comment ça marche :
La ligne que tu donnes est en 2 parties :
- la première, c'est gconftool, auquel tu ordonnes d'écrire une chaine "-t str" dans le paramètre "-s" nommé "/desktop/gnome/background/picture_filename" qui correspond au fond d'écran. /desktop/gnome/.../...filename ressemble à un fichier, mais ce n'en est pas un. C'est beaucoup plus proche d'une base de registre à la windows. L'écriture dans cette base de registre génère un événement qui sera capté par le gestionnaire de fenêtre : il s'en servira pour rafraichir l'écran automatiquement.
Pour le reste de la ligne, il faut avoir l'oeil car tu remarqueras qu'elle est encadrée par des "backticks" (les caractères `). Ils indiquent au shell qu'il doit exécuter la commande située en eux, et substituer le résultat aux bacticks de tel sorte que gconftool ne verra jamais que l'arguement qu'il a reçu vient d'une suite de commande complexe.
- la 2ème partie est donc cette suite de commande entre backticks. Elle commence par un find (trouver récursivement des fichiers) à partir du répertoire $HOMES/media/images ($HOMES est une variable qui sera elle-aussi substituée" dont le nom (-name) est *.jpg. Bref, on cherche tous les *.jpg. Ensuite, la liste (un fichier par ligne) est donnée par le tube (ou le pipe |) au programme "rl" qui va mélanger l'ordre des lignes (si tu lui donnes 1 2 3 en entrée, il peut te sortir en fonction du hasard 3 1 2 ou 2 1 3, etc...). Une fois les lignes mélangées, on les repasse par un autre pipe au programme tail, qui lui ne sortira que la dernière (-n 1) ligne qu'il aura eu en entrée. Comme rl ne fait jamais pareil et que tail ne prend que la dernière ligne, on a un fichier différent à chaque fois...

Voilà, ça peut paraitre compliqué, mais ça ne l'est pas. un système unix comme linux est bourré d'une multitude de petits utilitaires simples (comme tail, mais aussi sort, cut, cat...). La puissance vient du fait qu'on peut les assembler à l'infini et que l'on peut véritablement faire ce que l'on veut. Sous windows, au contraire, je dirai qu'il y a peu d'utilitaires mais que chacun est complexe... c'est à mon avis bien moins souple smile

Pour redémarrer adesklet (?) il suffit d'ajouter un truc du genre :

sleep 5 # on attend 5 secondes, car la mise à jour du fond peut prendre du temps
killall adesklet # on termine le adesklet actif
adesklet & # et on en relance un autre, en tache de fond (&)

Mais c'est la théorie. En pratique, ça peut être plus compliqué...

Pour augmenter la fréquence d'appel de ce script, il faut paramétrer autre chose que ce script, probablement "la crontab". Tu ne peux pas agir dedans car il est passif et conçu pour être réveillé à intervalle régulier.

Voilà, espérant que ça pourra t'aider smile


Pensez à mettre [Résolu] dans le titre une fois votre problème réglé !

Hors ligne

#3 Le 10/06/2006, à 11:25

mamourbizbiz

Re : script?

merci pour tous snapshot
tu as exactement repondu a mais question je vais potasser un peut
ton shell fonctionne impec je poste le script de thom avec ces quelque modification pour relancer adesklets a chaque changement de fond d'ecran pour eviter les problemes de transparance

#! /bin/bash
## dependances : randomize-lines
gconftool -t str -s /desktop/gnome/background/picture_filename "`find /home/fondecran/ -name \*.jpg | rl | tail -n 1`"


sleep 1 # on attend 1 secondes, car la mise à jour du fond peut prendre du temps

killall adesklets # on termine l'affichage des desklets de adesklet 

sleep 1

killall modubar.py                          #on termine les desklets actif 
killall systemmonitor.py
killall weather.py

adesklets --nautilus & # et on en relance un autre, en tache de fond (&)

ce script fonctionne mais il est possible que ce soit pas tres propre donc s'il y a des sugjestion?

plus tot que de modifier le contrab est il  possible de mettre a la fin du script

sleep 900 #attendre 15 min

et finir par une commande qui renvoi le programme au debut (je c pas si ça existe)
voila
et merci encore pour ta reponse rapide

smile

PS: maintenant qu'il y a 4 lignes c'est un script (cool mon premier script) big_smile

Dernière modification par mamourbizbiz (Le 10/06/2006, à 12:13)


ouai windows c'est pour les nuls...heu... comment ca marche ubuntu?

Hors ligne

#4 Le 10/06/2006, à 12:17

Zeo

Re : script?

Salut,
J'avais commencé un petit guide sur les différents langages de programmation qui existent et les plus pertinents pour mes camarades de Licence Pro Communication Electronique. Je voulais leur montrer qu'il n'y a pas que le HTML dans la vie ...
(ce guide doit comporter des erreurs et devra surement être amélioré ...)

Le guide en PDF >> http://damien.vidal1.free.fr/tutoriaux/tutoriaux/autres_veille_technologique.pdf

Dernière modification par Zeo (Le 10/06/2006, à 12:17)


Linux Ubuntu
---
Si un jour, on te reproche que ton travail n'est pas un travail de professionnel, dis-toi bien que :
Des amateurs ont construit l'arche de Noé, et des professionnels le Titanic.!

Hors ligne

#5 Le 10/06/2006, à 18:29

snapshot

Re : script?

mamourbizbiz a écrit :

merci pour tous snapshot

ce script fonctionne mais il est possible que ce soit pas tres propre donc s'il y a des sugjestion?

Du moment qu'il fonctionne, c'est déjà pas mal smile
Mais c'est vrai que ce n'est pas très propre : si tu ajoutes un nouveau desklet, il ne sera pas pris en compte par ton script.
Perso, j'utilise gdesklet, et quand on le "kill", tous les desklets qu'il avait lancé se terminent également. Y'a pas de soucis.

mamourbizbiz a écrit :

plus tot que de modifier le contrab est il  possible de mettre a la fin du script

sleep 900 #attendre 15 min

et finir par une commande qui renvoi le programme au debut (je c pas si ça existe)

Et bien oui, ça existe ! le shell est un vrai langage de programmation. Mais tu vas avoir des problèmes : en lançant ton script avec gnome-session, tu vas en lancer un nouveau à chaque fois que tu te connecteras. Si tu te déconnectes/reconnectes 4 fois, tu en lanceras 4 qui vont changer l'image de fond 4 fois en 15 minutes... il faut mettre un controle pour ne pas que ça se produise.

#! /bin/bash

DELAY=900 # delai avant prochaine mise à jour
LOCKFILE=/tmp/updbackgrnd-${USER}.lock # si ce fichier existe, un daemon est déjà lancé : ne rien faire 

# on contrôle qu'on est seul avec la commande lockfile (voir sa page man). Attention, elle n'est pas
# installée par défaut. Elle se situe dans le package procmail
if lockfile -r 0 $LOCKFILE
then

  # si on arrive ici, c'est qu'on est les seuls à s'exécuter... y'a plus qu'à faire le boulot !

  # la commande suivante effacera le fichier de verrouillage à la sortie du script
  trap "rm $LOCKFILE" EXIT

  # on commence une boucle infinie...
  # la seule façon d'en sortir, c'est de recevoir un signal de fin (par un kill). Dans ce cas, on exécutera le
  # rm placé dans le "trap", ce qui autorisera le lancement d'un nouverau script.
  while true
  do
    gconftool -t str -s /desktop/gnome/background/picture_filename "`find /home/fondecran/ -name \*.jpg | rl | tail -n 1`"

    sleep 1 # on attend 1 secondes, car la mise à jour du fond peut prendre du temps

    killall adesklets # on termine l'affichage des desklets de adesklet 

    sleep 1

    killall modubar.py                          #on termine les desklets actif 
    killall systemmonitor.py
    killall weather.py

    adesklets --nautilus & # et on en relance un autre, en tache de fond (&)

    sleep $DELAI

  done # recommencer à partir du while, ad vitam eternam

else
  # si on arrive ici, c'est que le fichier $LOCKFILE existe déjà. 
  # affichage du message d'erreur sur stderr (le ">&2", attention pas d'espace sinon autre signification)
  echo "Un autre daemon tourne déjà, abandon de celui-ci >&2

  # et on sort en indiquant un status d'erreur
  exit 1
fi
mamourbizbiz a écrit :

voila
et merci encore pour ta reponse rapide
smile

y'a pas de quoi wink
les shells, c'est mon passe-temps... il y en a qui font des sudokus, et bien moi je préfère écrire des shells lol !

mamourbizbiz a écrit :

PS: maintenant qu'il y a 4 lignes c'est un script (cool mon premier script) big_smile

C'est plus qu'un script, c'est carrément un daemon !


Pensez à mettre [Résolu] dans le titre une fois votre problème réglé !

Hors ligne

#6 Le 10/06/2006, à 23:27

mamourbizbiz

Re : script?

Merci snapshot et bravo je suis vraimant impressioné par tout ce que l'on peut faire
tu ma ouvert les yeux sur un nouveau monde .
ça ma l'aire assez compliqué quand meme mais je crois que je vais essayer de m'y mettre


je teste tout ça et je tien au courrant

merci a zeo pour sont interré a mon poste

ha oui autre precision maintenant il n'y a plus besoin de crontab (enfin si j'ai bien compris )
maiss est ce que je peut lancer un deamon au demmarage de la session et si oui quelle comande je doi utiliser pour le lancer (genre si mon daemon s'appele random-wallpaper la commande sera random-wallpaper?)

Dernière modification par mamourbizbiz (Le 10/06/2006, à 23:55)


ouai windows c'est pour les nuls...heu... comment ca marche ubuntu?

Hors ligne

#7 Le 11/06/2006, à 10:45

snapshot

Re : script?

mamourbizbiz a écrit :

Merci snapshot et bravo je suis vraimant impressioné par tout ce que l'on peut faire
ha oui autre precision maintenant il n'y a plus besoin de crontab (enfin si j'ai bien compris )
maiss est ce que je peut lancer un deamon au demmarage de la session et si oui quelle comande je doi utiliser pour le lancer (genre si mon daemon s'appele random-wallpaper la commande sera random-wallpaper?)

ah ben ça, c'est le plus facile !

Système / Préférences / Sessions
Programme au démarrage, puis ajouter... et enfin, Parcourir...

Pour appeler ta commande :
- soit elle est placée dans un répertoire inclu dans le $PATH (comme /usr/local/bin), auquel cas, il suffiit de taper son nom. La complétion avec la touche TAB la verra très bien.
- soit elle n'est pas dans le $PATH. Dans ce cas, il faut donner le chemin complet pour la lancer

Et bien sur, pour qu'elle soit exécutable, il ne faut pas oublier de donner au fichier l'attribut x (pour eXecuter) :
chmod a+x random-wallpaper

voilà, voilà !


Pensez à mettre [Résolu] dans le titre une fois votre problème réglé !

Hors ligne

#8 Le 14/06/2006, à 00:28

mamourbizbiz

Re : script?

ok mais je crois que le daemon ne fonctionne pas et je pense que ça plante dans la phase de test
pourtant j ai bien suprimer l'entrer de mon crontab qui lancai l'ancien script

donc normalement il ny a rien qui devrai bloquer

et je n ai pas bien compris ce passage la enfaite c quoi ce lockfile?
apres j arrete de t embeter et jessaye de me debrouiller tous seul mais la je dois dire que je patoge un peut

LOCKFILE=/tmp/updbackgrnd-${USER}.lock # si ce fichier existe, un daemon est déjà lancé : ne rien faire

# on contrôle qu'on est seul avec la commande lockfile (voir sa page man). Attention, elle n'est pas
# installée par défaut. Elle se situe dans le package procmail
if lockfile -r 0 $LOCKFILE
then


ouai windows c'est pour les nuls...heu... comment ca marche ubuntu?

Hors ligne

#9 Le 14/06/2006, à 01:34

snapshot

Re : script?

non non, y'a aucun soucis smile j'aime bien faire partager ce que j'ai moi même découvert .

le "if lockfile..." permet d'empecher de lancer plusieurs processus à la fois. Comment ça marche ?
et bien on se sert d'un fichier situé dans temp comme d'un feu de circulation : s'il est présent (rouge), c'est qu'il y a déjà un processus qui s'occupe de changer le fond d'écran, donc il ne sert à rien d'en lancer un autre : on ne passe pas.
S'il est inexistant (vert), et bien il faut s'occuper de changer le fond, et on empêche d'autres processus de se lancer en le créant (on passe et on allume le rouge derrière soi) smile

Si tu regardes bien le code, tu vois qu'il y a un "if lockfile..." qui teste l'état du fichier.
Après le "then", c'est la partie "verte", et après le "else", c'est la partie rouge.

Le shell s'attend à trouver une commande exécutable après un if, et si le code de retour de la commande est 0, il exécute le then, sinon, il exécute le else.

Comme commande, j'ai choisi lockfile car elle est faite pour ce cas de figure : en une seule opération, elle teste l'existence du fichier et le crée s'il n'existe pas. Dans ce cas, elle retourne 0, sinon une valeur non nulle. C'est exactement ce qu'il nous faut. Le paramètre "-r 0" indique de ne pas réessayer si le fichier existe déjà.

Mais cette commande n'est pas installé en standard. Si elle n'existe pas, linux retourne une code 127, ce qui fait que le if exécute la partie else... et rien ne se passe. C'est peut-être pour ça que ça ne marche pas... (tu as essayé un "sudo apt-get procmail" pour l'installer ?)

Sinon, tu peux essayer de remplacer la commande lockfile par ce moyen, un peu plus standard :

#! /bin/bash

DELAY=900 # delai avant prochaine mise à jour
LOCKFILE=/tmp/updbackgrnd-${USER}.lock # si ce fichier existe, un daemon est déjà lancé : ne rien faire

# on contrôle qu'il n'y a pas d'autres processus en cours
if [ -f $LOCKFILE ] # si le fichier n'existe pas
then
  # si on arrive ici, c'est qu'on est les seuls à s'exécuter... y'a plus qu'à faire le boulot !
  echo $$ > $LOCKFILE # on crée le fichier, et accessoirement, on place notre n° de processus dedans

  # la commande suivante effacera le fichier de verrouillage à la sortie du script
  trap "rm $LOCKFILE" EXIT

Voilà, ça fait quasiment pareil, mais c'est peut-être plus facile à comprendre...


Pensez à mettre [Résolu] dans le titre une fois votre problème réglé !

Hors ligne

#10 Le 14/06/2006, à 16:32

mamourbizbiz

Re : script?

ok je comprend un peut mieux ce qu il se passe smile

je regarde tous ça et je te repond fin de semaine prochaine car je part m éxiler pour mais examen
merci


ouai windows c'est pour les nuls...heu... comment ca marche ubuntu?

Hors ligne

#11 Le 28/06/2006, à 19:12

mamourbizbiz

Re : script?

me, revoila bon je comprend pas pourquoi ça ne fonctionne pas
je le lance dans un terminal le terminal s ouvre et ce referme instantanement sans rien afficher il ny a pas moyen de voir a quelle moment ça marche pas?


ouai windows c'est pour les nuls...heu... comment ca marche ubuntu?

Hors ligne