Команда уничтожения Linux -9 против -15 - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть процесс, который я хотел бы убить, а затем перезапустить службу. Кто-то написал код для остановки процесса, написав следующий набор сценариев

ps -ef |grep "process_name" | awk '{print "kill -15 " $2}'> /projects/test/kill.sh
#run the kill script
/projects/test/kill.sh

, а затем снова

ps -ef |grep "process_name" | awk '{print "kill -9 " $2}'> /projects/test/kill.sh
#run the kill script
/projects/test/kill.sh

#finally
service restart command here     
# the problem here is that service does not restart properly sometimes, 
as it thinks that process is still running.

Как я понимаю, kill -15 изящно убивает процесс. Но тогда они сразу же убивают -9. Так что, если процесс был убит в первой команде, что произойдет, если kill -9 также будет запущена в том же процессе? Или ps -ef даже перечислит этот процесс, так как он был помечен как kill?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

Если у вас есть возможность рефакторинга, вы можете использовать /proc/$PID как более эффективный способ определения, запущен ли процесс.

stopSvc() { local svc=$1
  read x pid x < <( ps -fu "$App_user" | grep -E " ($App_baseDIR/$1/|)$svc.jar$" ||: )
  local -i starting="$(date +%s)" # linux epoch timestamp in seconds
  while [[ -d "/proc/$pid" ]]
  do ps -fp "$pid"
     kill -term "$pid"
     if (( ( $(date +%s) - starting ) < 20 )) # been trying for less than 20s
     then sleep 2
          date
     else echo "$svc is hung - using a hard stop"
          kill -KILL "$pid"
          break
     fi
  done
  sleep 2
  [[ -d "/proc/$pid" ]] && return 1 || return 0  # flip the return
}

По сути, kill -15 - это сигнал term, который процесс может перехватить, чтобы вызвать постепенное завершение работы, закрытие каналов, сокетов и файлов, очистку временного пространства и т. Д., Поэтому для полезности он должен дать некоторое время. -9 является kill и не может быть пойман. Это Большой Молот , который вы используете, чтобы подавлять задания, которые плохо себя ведут, и должны быть зарезервированы для этих случаев.

Вы совершенно правы, в этом мало смысла. Если вы собираетесь использовать -9 так скоро, можете также пропустить небрежную попытку улучшить практику и просто удалить -15.

0 голосов
/ 22 апреля 2019

Вы правы, что kill -15 должен изящно убить процесс. Но убийство процесса происходит мгновенно. Таким образом, вышеприведенная программа будет проверять наличие pid, пытаясь изящно убить его. Если kill -15 не удастся - выполняется kill -9. То, как он знает, что kill -15 не удалось, это команда grep. Если kill -15 был успешным, то pid больше не должен существовать, в результате чего следующий grep возвратит пустым.

Так что на самом деле, kill -9 запускается только в том случае, если kill -15 не удалось корректно остановить программу. Проблема этого подхода заключается в том, что иногда постепенная остановка процесса может занять некоторое время в зависимости от программы. Так что ИМХО должен быть период ожидания или sleep в течение нескольких секунд, чтобы kill -15 мог попытаться изящно остановить процесс. Скорее всего, при вышеописанном подходе kill -9 почти всегда вызывается, так как сценарий не не оставляйте много времени для правильного завершения процесса. Если kill -15 все еще обрабатывает, kill -9 просто переопределит и немедленно остановит процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...