El script bash funciona pero da errores: "

El script bash funciona pero da errores: "

Intenté modificar un script existente para que funcione... la opción de inicio funciona bien. La opción "detener" funciona (termina el proceso correctamente pero produce algunos errores extraños. Consulte el resultado en la parte inferior. ¿Alguien puede ayudarme?

#!/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

Respuesta1

export kibana_exec="nohup /data/kibana-main/bin/kibana > /data/logs/kibana/kibana.log 2>&1 "
if [ ! -f $kibana_exec ]; then

Esto parece algo que daría el [: too many argumentserror: $kibana_execse expande a varias palabras (cinco, en el valor dado arriba), que no forman una prueba sensata, por lo que [arroja un error. No tiene mucho sentido incluso [ ! -f "$kibana_exec" ]porque el valor de la variable tampoco parece un nombre de archivo. Además, si quisieras usar la sustitución de comandos para ejecutar el programa y capturar lo que imprimió, usarías kibana_exec=$(command ...), pero aquí eso tampoco funcionará, ya que estás redirigiendo toda la salida a un archivo de registro.

Sin embargo, no puedo hacer coincidir el número de línea (39) del mensaje de error con el script. Por lo que puedo decir, la línea 39 es la export pid=$PIDFILEque no parece que deba dar un error.

No estoy exactamente seguro de qué es lo que estás intentando hacer aquí. ¿Debería kibana_execcontener solo el nombre del ejecutable ( /data/kibana-main/bin/kibana)? Y si es así, quizás deberías utilizar [ -x "$kibana_exec" ].


En la stop()función, kibana_execparece no estar configurada, por lo que [ ! -f $kibana_exec ]será solo [ ! -f ]qué pruebas para ver si -festá vacía. No lo es, por lo que la parte condicional nunca se ejecuta.

export PIDFILE="`(ps -eaf | grep kibana | awk '{print $2}')`"
export pid=$PIDFILE

Aquí, grepprobablemente coincida con varias líneas en la pssalida, es decir, kibanay él grepmismo, por lo que la salida final tiene dos PID, en dos líneas. Estos se configuran en pid, y cuando ejecuta su -c "... $pid", el shell iniciado suve dos líneas, y la segunda solo tiene el segundo PID. Intenta ejecutarlo como un comando, no lo encuentra y obtiene algo como 8197: command not found. Obviamente, lo line 1mencionado en el mensaje de error no es la primera línea del script completo, por lo que también funciona como una pista de que proviene de otro shell generado dentro del script.

Algo como pid=$(pgrep kibana)podría ser mejor ( pgrepno coincidirá consigo mismo), o pid=$(pgrep -d' ' kibana)separar el espacio de los PID, en caso de que haya más de uno (por lo que su -c "kill $pid"los eliminará a todos).

Respuesta2

Para eliminar el [: too many argumentserror, sugeriría poner cualquier variable en esa línea entre comillas dobles, lo que obligaría a limitarla a una cadena.

Por ejemplo, la línea 39 es:

export pid=$PIDFILE

intenta cambiarlo a:

export pid="$PIDFILE"

información relacionada