Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 08-06-2011 11:41:07

peuks
Membre
Inscription : 10-04-2010

[Shell bash] Erreur de condition

Plop !

Je pense avoir un léger soucis avec mon script on/off pour redshift ou autre .
Le but de script et de lancer une application et de la ferme dans le cas inverse .
Seulement que la deuxième condition ne se lance jamais !

pkill redshift
etat_redshift=`cat /tmp/redshift.pid`

if [ $etat_redshift=1 ]
then
        notify-send "redshift" "BON"
        redshift -l 48.4:7.6
        touch /tmp/redshift.pid
        echo 1 > /tmp/redshift.pid
else
        notify-send "redshift" "MAUVAIS"
        killall  redshift
        rm -r /tmp/redshift.pid
fi


Edit : Deuxième version avec le quel dans la théorie tout fonctionne ( avec echo a la place de redshift ) mais pas dans la pratique

#!/bin/bash

etat_redshift=/tmp/redshift.pid

if [ -e $etat_redshift ]
then

        notify-send "Redshift" "arret en cours";
        rm -r /tmp/redshift.pid;
        killall redshift;
else

        notify-send "Redshift" "lancement en cours" ;
        redshift -l 48.4:7.6 ;
        mkdir /tmp/redshift.pid ;

fi

Dernière modification par peuks (08-06-2011 12:07:36)

Hors ligne

#2 08-06-2011 13:45:03

zoroastre74
Membre
Distrib. : Debian Wheezy
Noyau : Linux 3.2
(G)UI : Awesome wm v3.4.13 (Octopus)
Inscription : 28-08-2010

Re : [Shell bash] Erreur de condition

Yep!

Un exemple pour tuer un processus en 1 seule ligne. Cà te donnera peut être des idées wink

ps aux | grep xterm | grep -v grep | awk '{print $2}' | xargs kill -9


@+

Zoroastre.

Hors ligne

#3 08-06-2011 18:06:13

zoroastre74
Membre
Distrib. : Debian Wheezy
Noyau : Linux 3.2
(G)UI : Awesome wm v3.4.13 (Octopus)
Inscription : 28-08-2010

Re : [Shell bash] Erreur de condition

Yep!


#!/bin/bash
ps ax | grep "[x]term" >/dev/null 2>&1
if [ $? != 0 ]; then
xterm -bg red
else
xterm -bg green
fi


En gros, si le processus existe, on lance un xterm vert, dans le cas contraire, un xterm rouge.
Le $? récupère la valeur de la dernière commande. (=0 si la commande s'est bien déroulée)

Les crochets entre le x sont indispensables, sinon çà ne marche pas. Equivalent d'un

grep "xterm" | grep -v grep


wink

@+

Zoroastre.

Dernière modification par zoroastre74 (08-06-2011 18:23:09)

Hors ligne

#4 27-06-2011 16:38:06

eol
Membre
Inscription : 03-09-2009

Re : [Shell bash] Erreur de condition

Bonjour,

peuks a écrit :

Plop !

Je pense avoir un léger soucis avec mon script on/off pour redshift ou autre .
Le but de script et de lancer une application et de la ferme dans le cas inverse.


Simplification possible en :

#!/bin/sh
pgrep redshift && pkill redshift || redshift -l 48.4:7.6

Hors ligne

#5 28-06-2011 11:16:33

peuks
Membre
Inscription : 10-04-2010

Re : [Shell bash] Erreur de condition

Si redshift apparait le quitter de suite si non le lancer ?

Cela ne crée pas une erreur de faire pgrep redshift && pkill redshift ? Je veux parler de la manière de l'écrire .
Comme faire un killall firefox alors qu'il n'est pas lancé . ( Si eol voit se que je veux dire  )

Hors ligne

#6 29-06-2011 00:35:55

eol
Membre
Inscription : 03-09-2009

Re : [Shell bash] Erreur de condition

peuks a écrit :

Si redshift apparait le quitter de suite si non le lancer ?


Oui

peuks a écrit :

Cela ne crée pas une erreur de faire pgrep redshift && pkill redshift ? Je veux parler de la manière de l'écrire .


Non, dans cette ligne, pkill s'execute seulement si pgrep a retourné une valeur ( car && veut dire "et" ) sinon le shell passe donc directement à l'autre coté du || sans se plaindre.

Hors ligne

#7 29-06-2011 09:49:30

Thuban
Modérateur
Distrib. : OpenBSD
Noyau : current
(G)UI : xfce ou dwm
Inscription : 09-01-2009
Site Web

Re : [Shell bash] Erreur de condition

Pour revenir au début, ta condition

if [ $etat_redshift=1 ]


n'est jamais fausse car en bash le = sert aux chaines de caractères. Pour les chiffres, c'est -gt (greater than), -eq (equal) ...
Donc il te faudrait :

if [ $etat_redshift -eq 1 ]


si bien sur c'est le chiffre 1 contenu dans le fichier pid.
Regarde man test pour plus d'infos wink


YA3HGA-H

Hors ligne

#8 29-06-2011 13:49:36

cthuluh
Membre
Distrib. : stable
Noyau : stable
(G)UI : ratpoison
Inscription : 17-08-2010

Re : [Shell bash] Erreur de condition

Thuban a écrit :

Pour revenir au début, ta condition

if [ $etat_redshift=1 ]


n'est jamais fausse car en bash le = sert aux chaines de caractères. Pour les chiffres, c'est -gt (greater than), -eq (equal) ...


Tu as mis le doigt sur quelque chose, mais ce n'est pas encore ça.
Sa condition est toujours vraie car

$etat_redshift=1


est considéré par le shell comme une seule chaîne, et

[ chaine ]


est toujours vrai (c'est une version implicite de

[ -n chaine ]


).

Une façon correcte d'écrire la condition est très proche de ce que tu as proposé :

if [ "$etat_redshift" -eq 1 ]; then ...


Ça peut paraître bateau, mais mettre des guillemets doubles autour de toutes
les utilisations de variables permet de résoudre des bugs autrement
mystérieux.

Hors ligne

#9 29-06-2011 13:56:49

cthuluh
Membre
Distrib. : stable
Noyau : stable
(G)UI : ratpoison
Inscription : 17-08-2010

Re : [Shell bash] Erreur de condition

eol a écrit :

Bonjour,
Simplification possible en :

#!/bin/sh
pgrep redshift && pkill redshift || redshift -l 48.4:7.6


Et même :

#!/bin/sh
pkill '^redshift$' || redshift -l 48.4:7.6


Si celà te convient, très bien, mais il existe des outils déjà pensés
pour gérer les logiciels de type "daemon", les lancer proprement
et les stopper proprement. Je t'invite à voir du côté de runit, packagé
sur debian et très bien documenté. Le simple fait de l'utiliser d'en apprendra
beaucoup sur la gestion des processus sur Unix.

En revanche, je ne peux que déconseiller l'utilisation de killall, ps aux | grep bla bla | xargs kill
et autres sucreries : ce n'est pas fiable et t'amènera à faire des bêtises.

Quelques liens utiles :
http://smarden.org/runit/
http://mywiki.wooledge.org/ProcessManagement

Hors ligne

Pied de page des forums