Bashscript gibt exit code nicht aus

status(){
 (ps aux | grep jboss/bin/run.sh | sed s/"grep jboss\/bin\/run.sh"/"-"/|
 grep jboss/bin/run.sh \> /dev/null) && (echo "There is an active jboss process";exit 0)||(echo "Jboss is not running";exit 1)
}
[...]
case "$1" in
 start)
 start
 ;;
 status)
 status
 ;;
[...]
exit 0

Moin, hab Suse Linux mit Jboss server.
Um ihn wie Apache auch mit /etc/init.d/jboss start zu starten, hab ich ein kleines SHELL-Scribt geschrieben.

Um zu vermeiden, dass er zweimal gestartet wird. Sollte „jboss start“ „jboss status“ ausführen und nur bei einem Fehlercode starten:

/etc/init.d/jboss status \>/dev/null && (echo "Jboss is already running"; exit 2) ||(/opt/jboss/bin/run.sh&amp:wink:

(Also nur Starten, wenn Jboss nit läuft.)

Aber irgendwie wird exit 1 nicht ausgeführt.
Kann das sein, das das in funktionen nicht möglich ist?

Hab nämlich auch das probiert: ./jboss status && echo ja || echo nein
Es kam immer „ja“ als antwort, egal ob das ding lief oder nit.
Oder wäres sinnvoller das mit Perl/Phyton/Ruby zu realisieren.
(Kenne keine der Sprachen, aber Perl scheint mir PHP ziemlich ählich zu sein)

Gruß Thomas

Hi Thomas,

status(){
(ps aux | grep jboss/bin/run.sh | sed s/„grep
jboss/bin/run.sh“/"-"/|
grep jboss/bin/run.sh > /dev/null) && (echo „There
is an active jboss process“;exit 0)||(echo „Jboss is not
running“;exit 1)
}
[…]
case „$1“ in
start)
start
;;
status)
status
;;
[…]
exit 0

das Problem dürften die runden Klammern sein. Sie sorgen dafür, dass die Befehle in einer eigenen Subshell gestartet werden (und ob die Subshell 1 zurückgibt, testest du ja nicht…)

Vielleicht so (ungetestet):

status()
{
 ps aux | grep jboss/bin/run.sh | grep -v 'grep' \
 \> /dev/null && 
 (
 echo "There is an active jboss process"
 exit 0
 ) || 
 (
 echo "Jboss is not running"
 exit 1
 )

 exit $?
}

Evtl. habe ich die Zeilenumbrüche vermurkst, aber vom Prizip her sollte es das sein. Oder sonst eben doch mit if … then … else … fi (auch wenn das mit && und || cooler aussieht :wink:

gruss
bernhard

> status(){  
> (ps aux | grep jboss/bin/run.sh | sed s/"grep jboss\/bin\/run.sh"/"-"/|  
> grep jboss/bin/run.sh \> /dev/null) && (echo "There is an active jboss process";exit 0)||(echo "Jboss is not running";exit 1)  
> }

Umpf! So sehr ich sonst fuer obfuscation bin… aber Du hast da wohl den Ueberblick verloren. Wie mein Vorredner schon so recht bemerkte beendet das erste exit 0 die subshell immer „erfolgreich“, die zweite subshell wird daher nie erreicht. Vielleicht fuer den Anfang doch einfacher[1] (sinngemaess):

status()
{
 if pgrep jboss
 then
 echo "laeuft"
 exit 0
 else
 echo "laeuft net"
 exit 1
 fi
}


> [...]  
> case "$1" in  
> start)  
> start  
> ;;  
> status)  
> status

Das wuerde auch glatt in diese Zeile passen.

> ;;  
> [...]  
> exit 0

hab Suse Linux mit Jboss server.

Was immer das sein mag.

Um ihn wie Apache auch mit /etc/init.d/jboss start zu
starten, hab ich ein kleines SHELL-Scribt geschrieben.

Bringt der kein eigenes SysV-Script mit?

Der elegante Weg waere uebrigens, sich die PID vom server zu merken / irgendwohin schreiben zu lassen und diese mit kill -0 $PID auf Existenz zu pruefen. (Wer mir sagt, wie ich rauskriege, ob hinter einer PID auch tatsaechlich das vermeintliche Programm steckt, kriegt ein Bienchen.)

HTH,
Gruss vom Frank.
[1] Wenn es komplizierter sein soll lassen sich nach Belieben cat, uudecode, md5sum, etc. einbauen.

Hi Thomas,

status(){
(ps aux | grep jboss/bin/run.sh | sed s/"grep

Mit:
ps -opid=, -C run.sh
sparst Du Dir das ganze rumgegreppe.
Allerdings ist run.sh natürlich ein Name, der zu Verwechslungen einlädt.