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 arguments
error: $kibana_exec
se 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=$PIDFILE
que no parece que deba dar un error.
No estoy exactamente seguro de qué es lo que estás intentando hacer aquí. ¿Debería kibana_exec
contener 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_exec
parece no estar configurada, por lo que [ ! -f $kibana_exec ]
será solo [ ! -f ]
qué pruebas para ver si -f
está 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í, grep
probablemente coincida con varias líneas en la ps
salida, es decir, kibana
y él grep
mismo, 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 su
ve 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 1
mencionado 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 ( pgrep
no 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 arguments
error, 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"