Я попытался изменить существующий скрипт, чтобы он работал... опция 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"