У меня была точно такая же проблема. Иногда команда ./shutdown.sh
не останавливает процесс tomcat, и ее java
процесс остается в запущенных процессах.
Я решил эту проблему, используя версию Tomcat в репозиториях программного обеспечения Ubuntu:
sudo apt-get install tomcat7
После установки из диспетчера пакетов и настройки некоторых параметров у меня не возникло проблем при остановке / запуске Tomcat. Я использовал эту команду для остановки, и она никогда не заканчивалась:
service tomcat7 stop
, что почти совпадает с
/etc/init.d/tomcat7 stop
С помощью этой команды запускается блок кода из сценария инициализации, в частности коды из файла /etc/init.d/tomcat7
. Поэтому я посмотрел в него, чтобы увидеть, что он делает, чтобы всегда успешно завершать процесс tomcat Вот блок кода, который запускается при использовании команды service tomcat7 stop
:
log_daemon_msg "Stopping $DESC" "$NAME"
set +e
if [ -f "$CATALINA_PID" ]; then
start-stop-daemon --stop --pidfile "$CATALINA_PID" \
--user "$TOMCAT7_USER" \
--retry=TERM/20/KILL/5 >/dev/null
if [ $? -eq 1 ]; then
log_progress_msg "$DESC is not running but pid file exists, cleaning up"
elif [ $? -eq 3 ]; then
PID="`cat $CATALINA_PID`"
log_failure_msg "Failed to stop $NAME (pid $PID)"
exit 1
fi
rm -f "$CATALINA_PID"
rm -rf "$JVM_TMP"
else
log_progress_msg "(not running)"
fi
log_end_msg 0
set -e
;;
Важная часть такова:
start-stop-daemon --stop --pidfile "$CATALINA_PID" \
--user "$TOMCAT7_USER" \
--retry=TERM/20/KILL/5 >/dev/null
Это означает «повторная остановка до тех пор, пока процесс не будет остановлен. Вот документация команды --retry из start-stop-daemon manual:
-R|--retry timeout|schedule
With --stop, specifies that start-stop-daemon is to check
whether the process(es) do finish. It will check repeatedly
whether any matching processes are running, until none are. If
the processes do not exit it will then take further action as
determined by the schedule.
If timeout is specified instead of schedule then the schedule
signal/timeout/KILL/timeout is used, where signal is the signal
specified with --signal.
...
Итак, --retry=TERM/20/KILL/5
означает «Отправить TERM сигнал процессу, подождать 20 секунд, если он все еще работает, отправить сигнал KILL , подождать 5 секунд, если он все еще работает» есть проблема.
Это означает, что вы можете настроить tomcat для запуска в качестве демона и использовать команду, подобную этой, или написать скрипт для выполнения такого рода действия, чтобы остановить tomcat, или просто использовать Ubuntu и получить tomcat из диспетчера пакетов.