Bash-Skript funktioniert, gibt aber Fehler aus: „

Bash-Skript funktioniert, gibt aber Fehler aus: „

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_execwird 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_execnur 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_execscheint es nicht gesetzt zu sein, daher [ ! -f $kibana_exec ]wird nur [ ! -f ]geprüft, ob -fes 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 grepstimmt das wahrscheinlich mit mehreren Zeilen in der psAusgabe überein, nämlich kibanaund das grepselbst, 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 suzwei 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 1in 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 ( pgrepstimmt 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"

verwandte Informationen