2016-05-26 7 views
0

OK, ich habe lange genug damit herumgefummelt. Ich arbeite an einem Init-Skript für eine Anwendung und habe eine schwierige Zeit mit der Stop-Funktion. Es scheint immer zu meiner ersten Bedingung zu passen und wird nie korrekt berichten, wenn der Dienst tatsächlich ausgefallen ist.Init-Skript gibt keine korrekten Werte basierend auf dem tatsächlichen Zustand zurück

Mein Code:

#!/bin/bash -x 

. /etc/rc.d/init.d/functions 

LOCKFILE=/var/lock/subsys/java 
logger="/usr/bin/logger -t rc.local" 
log_msg_start="Starting java Services:" 
log_msg_stop="Stopping java Services:" 
VAR=$(/usr/sbin/lsof -i :8080 | awk 'FNR == 2 {print $10}') 
VAR2="(LISTEN)" 

Above ich die Ausgabe von VAR zu sein "(LISTEN)" erwarten, wenn der Dienst läuft noch.

-Code weiter ...

stop(){ 
echo -n "$log_msg_stop" 
    cd /opt/java/bin/ ; ./java stop &>/dev/null & 
    sleep 10 
    rm -rf $LOCKFILE 

    if [ "$VAR" == $VAR2 ] 
    then echo "Still running, try again" 

    elif [ "$VAR" != $VAR2 ] 
    then echo "Service is stopped" 
    fi 

    echo 
} 

Scheint einfach genug, nicht wahr?

Hier ist die Debug-Ausgabe, wenn ich den Anruf ausführen.

+ LOCKFILE=/var/lock/subsys/java 
+ logger='/usr/bin/logger -t rc.local' 
+ log_msg_start='Starting java Services:' 
+ log_msg_stop='Stopping java Services:' 
++ /usr/sbin/lsof -i :8080 
++ awk 'FNR == 2 {print $10}' 
+ VAR='(LISTEN)' 
+ VAR2='(LISTEN)' 
+ case "$1" in 
+ stop 
+ echo -n 'Stopping java Services:' 
Stopping java Services:+ cd /opt/java/bin/ 
+ sleep 10 
+ ./java stop 
+ rm -rf /var/lock/subsys/java 
+ '[' '(LISTEN)' == '(LISTEN)' ']' 
+ echo 'Still running, try again' 
Still running, try again 
+ echo 

+ exit 0 

Punkte der Klärung:

1) diese Zeile:

cd /opt/java/bin/ ; ./java stop &>/dev/null & 

ist ein gekettet Befehl und wechseln mit cd in den Ordner dann ./java nicht mehr ausgeführt. Ich mache es so, weil es anders nicht funktioniert. FYI Ich führe es auf die gleiche Weise für die Startfunktion und es funktioniert gut.

2) Das Konzept des Stoppfunktionsteils des Skripts besteht darin, mit einem fehlerhaften Dienst zu arbeiten, der beim ersten Mal nicht immer heruntergefahren wird. Daher das "immer noch laufen, versuchen Sie es erneut". Sobald ich diesen Teil des Skripts bekomme, um die korrekte Bedingung zu erkennen, werde ich an einer while-Schleife arbeiten, um es so lange laufen zu lassen, bis es den korrekten Zustand sieht.

3) Ich habe auch versucht, den Status des Dienstes in eine Textdatei auszugeben und grep es für den Inhalt zu entsprechen. So zu tun hatte keine Auswirkungen auf das Verhalten.

4) Dieser Service wird läuft das Format:

service java start 
service java stop 
service java status 

FYI "java" für das eigentliche Programm wird ersetzt mit denen ich arbeite.

+0

'cd ..; ./java stop' ist * nicht * verkettet. Der './java stop' wird auch dann ausgeführt, wenn' cd' fehlschlägt usw. –

+0

Auch './java stop &' läuft im Hintergrund, so dass es möglicherweise nicht bis zum Zeitpunkt der Überprüfung gestoppt wurde. Außerdem setzen Sie '$ VAR' am Anfang Ihres Skripts * bevor * Sie versuchen, den Dienst zu stoppen. Das wird ** niemals ** sehen, dass der Dienst von Ihrer "Stop" -Funktion gestoppt wurde. –

Antwort

0

Auch Sie setzen $VAR am Anfang Ihres Skripts vor Sie versuchen, den Dienst zu stoppen. Das wird nie sehen, dass der Dienst von Ihrer stop Funktion gestoppt wurde. - Etan Reisner

Verwandte Themen