Скрипт bash работает, но выдает ошибки: «

Скрипт bash работает, но выдает ошибки: «

Я попытался изменить существующий скрипт, чтобы он работал... опция start работает нормально. Опция stop работает (она успешно завершает процесс, но выдает какие-то странные ошибки. Пожалуйста, посмотрите вывод внизу. Может ли кто-нибудь помочь?

#!/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

решение1

export kibana_exec="nohup /data/kibana-main/bin/kibana > /data/logs/kibana/kibana.log 2>&1 "
if [ ! -f $kibana_exec ]; then

Это похоже на то, что даст ошибку [: too many arguments: $kibana_execрасширяется до нескольких слов (пять, в значении, указанном выше), которые не образуют разумный тест, поэтому [выдает ошибку. Это не имеет особого смысла даже с , [ ! -f "$kibana_exec" ]поскольку значение в переменной также не похоже на имя файла. Кроме того, если вы хотели использовать подстановку команд для запуска программы и захвата того, что она напечатала, вы бы использовали kibana_exec=$(command ...), но здесь это тоже не сработает, поскольку вы перенаправляете весь вывод в файл журнала.

Однако я не могу сопоставить номер строки (39) в сообщении об ошибке со сценарием. Насколько я могу судить, строка 39 — это export pid=$PIDFILE, что не выглядит так, будто должно вызывать ошибку.

Я не совсем уверен, что именно вы пытаетесь здесь сделать, должно ли kibana_execхраниться только имя исполняемого файла ( /data/kibana-main/bin/kibana)? И если так, возможно, вам следует использовать [ -x "$kibana_exec" ].


В stop()функции kibana_execвыглядит неустановленным, поэтому [ ! -f $kibana_exec ]будет просто [ ! -f ]which тесты, чтобы увидеть, является ли -fон пустым. Это не так, поэтому условная часть никогда не выполняется.

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

Здесь, grepвероятно, соответствует нескольким строкам в psвыводе, а именно kibanaи grepсам , поэтому конечный вывод имеет два PID в двух строках. Они устанавливаются в pid, и когда вы запускаете su -c "... $pid", оболочка, запущенная с помощью , suвидит две строки, причем вторая имеет только второй PID. Он пытается запустить это как команду, не находит ее, и вы получаете что-то вроде 8197: command not found. line 1Упомянутый в сообщении об ошибке, очевидно, не является первой строкой полного скрипта, так что это также работает как подсказка, что это из другой оболочки, порожденной внутри скрипта.

Что-то вроде этого pid=$(pgrep kibana)может быть лучше ( pgrepне будет соответствовать самому себе) или pid=$(pgrep -d' ' kibana)разделить пространство PID, просто на тот случай, если их больше одного (чтобы su -c "kill $pid"уничтожить их все).

решение2

Чтобы избавиться от этой [: too many argumentsошибки, я бы предложил заключить любую переменную в этой строке в двойные кавычки, ограничив ее одной строкой.

Например, строка 39:

export pid=$PIDFILE

попробуйте изменить его на:

export pid="$PIDFILE"

Связанный контент