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