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) .