Я написал скрипт для запуска и остановки моего сервера Perforce. Чтобы выключить сервер, я использую команду kill -SIGTERM
с PID демона сервера. Он работает как должен, но в моем скрипте есть некоторые расхождения, касающиеся поведения вывода.
Сценарий выглядит следующим образом:
#!/bin/sh -e
export P4JOURNAL=/var/log/perforce/journal
export P4LOG=/var/log/perforce/p4err
export P4ROOT=/var/local/perforce_depot
export P4PORT=1666
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
. /lib/lsb/init-functions
p4start="p4d -d"
p4stop="p4 admin stop"
p4user=perforce
case "$1" in
start)
log_action_begin_msg "Starting Perforce Server"
daemon -u $p4user -- $p4start;
echo "\n"
;;
stop)
echo "BLABLA"
echo "$(pidof /usr/local/bin/p4d)"
#daemon -u $p4user -- $p4stop;
p4dPid="$(pidof /usr/local/bin/p4d)"
echo $p4dPid
if [ -z "$(pidof /usr/local/bin/p4d)" ]; then
echo "ERROR: No Perforce Server running!"
else
echo "SUCCESS: Found Perforce Server running!\n\t"
echo "Shutting down Perforce Server..."
kill -15 $p4dPid;
fi
echo "\n"
;;
restart)
stop
start
;;
*)
echo "Usage: /etc/init.d/perforce (start|stop|restart)"
exit 1
;;
esac
exit 0
Когда p4d
работает, блок stop
работает, как предполагалось, но когда нет p4d
, запускающего скрипт с stop
, выводит только BLABLA
и пустую новую строку из-за echo "$(pidof /usr/local/bin/p4d)"
. Сообщение об ошибке, указывающее, что ни один сервер не работает, никогда не печатается. Что я тут не так делаю?
PS: деталь if [ -z "$(pidof /usr/local/bin/p4d)" ]; then
была изменена с if [ -z "$p4dPid" ]; then
по причинам отладки.
РЕДАКТИРОВАТЬ: Я сузил проблему. Если я не использую переменную p4dPid
и закомментирую строки p4dPid="$(pidof /usr/local/bin/p4d)"
и echo $p4dPid
, обрабатывается блок if
и выводятся сообщения об ошибках. Тем не менее я не понимаю, что вызывает такое поведение.
РЕДАКТИРОВАТЬ 2: Проблема решена!
-e
в #!/bin/sh -e
заставляло оболочку выходить из скрипта после любого оператора, возвращающего ненулевое возвращаемое значение.