Что может быть причиной того, что «kill -9» не работает должным образом несколько раз? - PullRequest
2 голосов
/ 04 мая 2019

Я создал сценарий bash для уничтожения некоторых процессов, которые остались в живых после запуска сценариев завершения работы.

#!/bin/sh
echo "Alive processes on" `date` ":" > $LOG_DIR/roguePs.out
ps auxww | grep 'fr_home' | grep -v 'grep' | grep -v 'stopAll.sh' >> $LOG_DIR/roguePs.out
kill -9 $(ps axww | grep 'fr_home' | grep -v 'grep' | grep -v 'stopAll.sh' | cut -d " " -f 2)
sleep 10
echo "Alive processes on" `date` ":" >> $LOG_DIR/roguePs.out
ps auxww | grep 'fr_home' | grep -v 'grep' | grep -v 'stopAll.sh' >> $LOG_DIR/roguePs.out

Короче говоря, скрипт выше:

  • Перечисляет все процессы, которые содержат строку "fr_home", за исключением одного, в котором перечислены процессы и сам скрипт (stopAll.sh)
  • Убивает любой найденный процесс
  • Список процессов, оставшихся в живых после уничтожения

Итак, скрипт использует «kill -9» и иногда успешно убивает все, но были случаи, когда один процесс оставался живым.

Выходной файл показывает что-то вроде:

Alive processes on Sat May 4 12:54:15 2019 :
...
<other processes>
...
oracle  6066  0.0  0.7705128413368 ?        O   May 01  8:03 /opt/app/oracle/product/middleware/fr_home/bin/rwserver server=RptSvr_tst1 batch=yes uid=1373394053
...
<other processes>
...
Alive processes on Sat May 4 12:54:25 2019 :
oracle  6066  0.0  0.7705264421520 ?        S   May 01  8:03 /opt/app/oracle/product/middleware/fr_home/bin/rwserver server=RptSvr_tst1 batch=yes uid=1373394053

Процесс находится в состоянии "O" (процесс выполняется в процессоре) перед уничтожением и "S" (в спящем режиме) после. Никогда в состоянии "Z" (Zombie), которое я видел в списке возможных причин, по которым "kill -9" может не справиться с работой.

Кроме того, хотя процессы проверяются через 10 секунд, я также вручную проверил его несколько часов спустя, и он остается живым.

Не уверен, что может привести к тому, что уничтожение не сработает, или что еще нужно реализовать, чтобы обеспечить последовательное уничтожение всех процессов.

Любые предложения будут с благодарностью.

1 Ответ

1 голос
/ 06 мая 2019

OK. Мне удалось найти команду, которая, кажется, хорошо работает для меня.

Итак, вот варианты оценки:

  • pgrep и pkill: имеет смысл сначала попробовать эти команды, так как они предназначены для выполнения именно того, что мне нужно, и в большинстве Unix-подобных ОС они, вероятно, выполняют свою работу. Однако эта опция не сработала для меня, потому что команда усекалась, а в pkill -f 'fr_home' отсутствовали некоторые процессы.
  • Используйте awk вместо cut: вывод команды ps axww слишком длинный, поэтому awk генерировал сообщения об ошибках типа 'awk: record `oracle 3553 0.1 ...' too long '.
  • Использование gawk вместо cut: Да, gawk (улучшенная версия awk) работал для меня. Итак, команда:
kill -9 $(ps axww | grep 'fr_home' | grep -v 'grep' | grep -v 'stopAll.sh' | cut -d " " -f 2)

стали:

kill -9 $(ps axww | grep 'fr_home' | grep -v 'grep' | grep -v 'stopAll.sh' | gawk '{print $1}')
...