Tentei modificar um script existente para funcionar. A opção de início funciona bem. A opção "parar" funciona (ela encerra o processo com sucesso, mas gera alguns erros estranhos. Veja a saída na parte inferior. Alguém pode ajudar?
#!/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
Responder1
export kibana_exec="nohup /data/kibana-main/bin/kibana > /data/logs/kibana/kibana.log 2>&1 "
if [ ! -f $kibana_exec ]; then
Isso parece algo que daria o [: too many arguments
erro: $kibana_exec
expande para várias palavras (cinco, no valor fornecido acima), que não formam um teste sensato, então [
gera um erro. Não faz muito sentido, mesmo [ ! -f "$kibana_exec" ]
porque o valor na variável também não se parece com um nome de arquivo. Além disso, se você pretende usar a substituição de comando para executar o programa e capturar o que ele imprimiu, você usaria kibana_exec=$(command ...)
, mas aqui isso também não funcionará, já que você está redirecionando toda a saída para um arquivo de log.
No entanto, não consigo corresponder o número da linha (39) na mensagem de erro ao script. Pelo que eu sei, a linha 39 é a export pid=$PIDFILE
, o que não parece dar um erro.
Não tenho certeza do que você está tentando fazer aqui. Deve kibana_exec
conter apenas o nome do executável ( /data/kibana-main/bin/kibana
)? E se sim, talvez você deva usar [ -x "$kibana_exec" ]
.
Na stop()
função, kibana_exec
parece não estar definido, então [ ! -f $kibana_exec ]
será apenas [ ! -f ]
quais testes verificar se -f
está vazio. Não é, então a parte condicional nunca é executada.
export PIDFILE="`(ps -eaf | grep kibana | awk '{print $2}')`"
export pid=$PIDFILE
Aqui, grep
provavelmente corresponde a várias linhas na ps
saída, ou seja kibana
, a grep
própria, então a saída final tem dois PIDs, em duas linhas. Eles são definidos como pid
e, quando você executa su -c "... $pid"
, o shell iniciado por su
vê duas linhas, com a segunda tendo apenas o segundo PID. Ele tenta executar isso como um comando, não o encontra e você obtém algo como 8197: command not found
. O que line 1
é mencionado na mensagem de erro obviamente não é a primeira linha do script completo, então isso também funciona como uma dica de que é de outro shell gerado dentro do script.
Algo como pid=$(pgrep kibana)
pode ser melhor ( pgrep
não corresponde a si mesmo), ou pid=$(pgrep -d' ' kibana)
separar o espaço dos PIDs, caso haja mais de um (então su -c "kill $pid"
matará todos eles).
Responder2
Para se livrar do [: too many arguments
erro, sugiro colocar qualquer variável nessa linha entre aspas duplas, forçando-a a ficar restrita a uma string.
Por exemplo, a linha 39 é:
export pid=$PIDFILE
tente alterá-lo para:
export pid="$PIDFILE"