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.
'cd ..; ./java stop' ist * nicht * verkettet. Der './java stop' wird auch dann ausgeführt, wenn' cd' fehlschlägt usw. –
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. –