Ich habe versucht, ein vorhandenes Skript so zu ändern, dass es funktioniert. Die Startoption funktioniert einwandfrei. Die Option „Stopp“ funktioniert (sie beendet den Prozess zwar erfolgreich, hat aber einige seltsame Fehler ausgegeben). Bitte sehen Sie sich die Ausgabe unten an. Kann mir bitte jemand helfen?
#!/bin/sh
# ckconfig: 35 99 1
### BEGIN INIT INFO
# Provides: kibana
# Required-Start: $syslog $network $named $remote_fs $time networker
# Required-Stop: $syslog
# Should-Start: $ALL
# Should-Stop: $ALL
# Default-Start: 3 5
# Default-Stop: 0 6
# Description: Start the kibana application
### END INIT INFO
SCRIPT_NAME="$0"
SERVICE_NAME="kibana"
usage()
{
echo "USAGE: kibana start|stop" 1>&2
exit 1
}
start()
{
export kibana_exec="nohup /data/kibana-main/bin/kibana > /data/logs/kibana/kibana.log 2>&1 "
export kibana_parms="&"
if [ ! -f $kibana_exec ]; then
echo "kibana ERROR"
RETVAL=1
return 1
fi
/bin/su - Delk_admin_dev -c "$kibana_exec $kibana_parms 2>&1"
RETVAL=$?
return $RETVAL
}
stop()
{
export PIDFILE="`(ps -eaf | grep kibana | awk '{print $2}')`"
export pid=$PIDFILE
if [ ! -f $kibana_exec ]; then
echo "kibana ERROR"
RETVAL=1
return 1
fi
/bin/su - Delk_admin_dev -c "kill -15 $pid"
RETVAL=$?
return $RETVAL
}
case "$1" in
start)
start
;;
stop)
stop
;;
*)
/bin/echo $"Usage: kibana {start|stop}"
;;
esac
exit $?
[Delk_admin_dev@pvmdlr001 ~]$ ./newbash stop
./newbash: line 39: [: too many arguments
Password:
-bash: line 1: 8197: command not found
Antwort1
export kibana_exec="nohup /data/kibana-main/bin/kibana > /data/logs/kibana/kibana.log 2>&1 "
if [ ! -f $kibana_exec ]; then
Das sieht nach etwas aus, das den Fehler erzeugen würde [: too many arguments
: $kibana_exec
wird auf mehrere Wörter erweitert (fünf, im oben angegebenen Wert), die keinen sinnvollen Test bilden, also [
wird ein Fehler ausgelöst. Es ergibt auch mit nicht viel Sinn, [ ! -f "$kibana_exec" ]
da der Wert in der Variable auch nicht wie ein Dateiname aussieht. Wenn Sie außerdem Befehlssubstitution verwenden wollten, um das Programm auszuführen und zu erfassen, was es ausgibt, würden Sie verwenden kibana_exec=$(command ...)
, aber das funktioniert hier auch nicht, da Sie die gesamte Ausgabe in eine Protokolldatei umleiten.
Ich kann die Zeilennummer (39) in der Fehlermeldung jedoch nicht dem Skript zuordnen. Soweit ich das beurteilen kann, ist Zeile 39 die export pid=$PIDFILE
, die nicht so aussieht, als ob sie einen Fehler ausgeben sollte.
Ich bin nicht ganz sicher, was Sie hier versuchen. Soll kibana_exec
nur der Name der ausführbaren Datei ( /data/kibana-main/bin/kibana
) enthalten sein? Und wenn ja, sollten Sie vielleicht verwenden [ -x "$kibana_exec" ]
.
In der stop()
Funktion kibana_exec
scheint es nicht gesetzt zu sein, daher [ ! -f $kibana_exec ]
wird nur [ ! -f ]
geprüft, ob -f
es leer ist. Es ist nicht leer, daher wird der bedingte Teil nie ausgeführt.
export PIDFILE="`(ps -eaf | grep kibana | awk '{print $2}')`"
export pid=$PIDFILE
Hier grep
stimmt das wahrscheinlich mit mehreren Zeilen in der ps
Ausgabe überein, nämlich kibana
und das grep
selbst, sodass die endgültige Ausgabe zwei PIDs in zwei Zeilen enthält. Diese werden auf gesetzt pid
, und wenn Sie ausführen su -c "... $pid"
, sieht die von gestartete Shell su
zwei Zeilen, wobei die zweite nur die zweite PID enthält. Sie versucht, das als Befehl auszuführen, findet es nicht und Sie erhalten etwas wie 8197: command not found
. Das line 1
in der Fehlermeldung erwähnte ist offensichtlich nicht die erste Zeile des vollständigen Skripts, sodass dies auch als Hinweis darauf dient, dass es von einer anderen Shell stammt, die innerhalb des Skripts erstellt wurde.
Etwas wie pid=$(pgrep kibana)
könnte besser sein ( pgrep
stimmt nicht mit sich selbst überein) oder pid=$(pgrep -d' ' kibana)
den PID-Bereich zu trennen, nur für den Fall, dass es mehr als eine gibt (und su -c "kill $pid"
sie daher alle zerstört).
Antwort2
Um den Fehler zu beheben [: too many arguments
, empfehle ich, alle Variablen in dieser Zeile in Anführungszeichen zu setzen, um sie auf eine Zeichenfolge zu beschränken.
Zeile 39 lautet beispielsweise:
export pid=$PIDFILE
Versuchen Sie, es wie folgt zu ändern:
export pid="$PIDFILE"