o script bash funciona, mas apresenta erros: "

o script bash funciona, mas apresenta erros: "

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 argumentserro: $kibana_execexpande 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_execconter 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_execparece não estar definido, então [ ! -f $kibana_exec ]será apenas [ ! -f ]quais testes verificar se -festá vazio. Não é, então a parte condicional nunca é executada.

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

Aqui, grepprovavelmente corresponde a várias linhas na pssaída, ou seja kibana, a grepprópria, então a saída final tem dois PIDs, em duas linhas. Eles são definidos como pide, quando você executa su -c "... $pid", o shell iniciado por suvê 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 ( pgrepnã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 argumentserro, 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"

informação relacionada