script bash funciona, mas dá erros: “[: muitos argumentos” e “8197: comando não encontrado” [duplicado]

1

Eu tentei modificar um script existente para funcionar. a opção start funciona bem. A opção "stop" funciona (mata o processo com sucesso, mas deu alguns erros estranhos. Por favor, veja a saída na parte inferior. Alguém por favor 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
    
por hungl99 30.05.2017 / 18:18

2 respostas

3

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 erro [: too many arguments : $kibana_exec expande para várias palavras (cinco, no valor fornecido acima), que não formam um teste sensato, por isso [ gera um erro. Não faz muito sentido mesmo com [ ! -f "$kibana_exec" ] , já que o valor na variável também não se parece com um nome de arquivo. Além disso, se você quisesse usar a substituição de comando para executar o programa e capturar o que foi impresso, você usaria kibana_exec=$(command ...) , mas aqui 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. Tanto quanto eu posso dizer, a linha 39 é o export pid=$PIDFILE , que não parece que deveria dar um erro.

Não sei exatamente o que você está tentando fazer aqui, deve kibana_exec manter apenas o nome do executável ( /data/kibana-main/bin/kibana )? E se sim, talvez você devesse usar [ -x "$kibana_exec" ] .

Na função stop() , kibana_exec parece não estar definido, portanto [ ! -f $kibana_exec ] será apenas [ ! -f ] , que testa 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, o grep provavelmente corresponde a várias linhas na saída ps , ou seja, kibana e a grep em si, portanto, 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 line 1 mencionado na mensagem de erro obviamente não é a primeira linha do script completo, de modo que também funciona como uma dica de que é de outro shell criado dentro do script.

Algo como pid=$(pgrep kibana) pode ser melhor ( pgrep não coincide com ele mesmo) ou pid=$(pgrep -d' ' kibana) para separar o espaço de PIDs, caso haja mais de um (portanto, su -c "kill $pid" irá matar todos) .

    
por 30.05.2017 / 18:50
0

Para se livrar do erro [: too many arguments , sugiro colocar qualquer variável nessa linha entre aspas duplas, forçando-o a ser restringido a uma string.

Por exemplo A linha 39 é:

export pid=$PIDFILE

tente alterá-lo para:

export pid="$PIDFILE"
    
por 30.05.2017 / 18:52