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