#linux #bash #shell #unix #process
Вопрос:
У меня есть сценарий workingScript.sh .У меня есть еще один сценарий, называемый как monitorscript.sh который я хочу использовать для мониторинга процессов деятельности workingScript.sh.
Я хочу убедиться, что если есть какой-либо идентификатор процесса wc/cat, созданный помимо тех, которые были сгенерированы с 17506(родительский процесс workingScript.sh),он должен быть убит monitorscript.sh
ps aux|grep "workingScript*"
svc.test 25896 0.0 0.0 112812 984 pts/3 S 01:15 0:00 grep --color=auto workingScript*
svc.test 17506 0.0 0.0 113288 1072 ? S Mar18 0:00 sh workingScript.sh
svc.test 17510 0.0 0.0 113412 868 ? S Mar18 0:03 sh workingScript.sh
Дерево процессов для workingScript.sh идентификатор родительского процесса отображается следующим образом.
pstree -p 17506
sh(17506)─┬─cat(17509)
└─sh(17510)─wc(17569)
Таким образом, в любой момент времени, если какой-либо идентификатор процесса wc/cat запускается отдельно от тех, которые созданы workingScript.sh(в данном случае 17509/17569 в соответствии с приведенным выше деревом процессов) его следует убить
Мы можем использовать PPID для получения идентификатора процесса одного и того же сценария, но как мы можем получить для другого сценария и связанных дочерних процессов для другого сценария
Кто-нибудь, пожалуйста, может мне помочь ?
Комментарии:
1. Передайте PPID «другого сценария» в файл из сценария. Затем вы можете ссылаться на файл и PID из другого процесса.
2. В целом,
it should be killed by monitorscript.sh
это просто неправильный подход. Я действительно не понимаю, в чем смысл — еслиcat
он достаточно короткий, тоmonitorscript.sh
даже не собираюсь его замечать.how can we get for different script and related child processes for a different script
Как вы показали,ps aux | grep
написано лучше, какpgrep
иpstree
. Вы использовали их в своем посте — так что используйте их в своем сценарии.3. @kamilCuk На самом деле для демонстрации я упомянул кошку ,кошку, ее процесс inotifywait, который я хочу убить. Поэтому я согласен с вашей точкой зрения о том, почему кто-то пытается убить кошачий процесс, но на самом деле это не так
Ответ №1:
Запустите workingScript.sh
с LD_PRELOAD
с переопределенными exec*()
вызовами. Затем внутри этих exec*()
вызовов проверьте, разрешена ли команда wc
или cat
выполнена. Если это так, raise
какой-нибудь убийственный сигнал, если хотите. Не забудьте экспортировать LD_PRELOAD
, чтобы дочерние процессы exec*()
также были переопределены.
Если вы хотите периодически проверять скрипт на наличие процессов, то просто найдите pid и убейте их:
pid=$(pgrep workingScript.sh)
while sleep "$polling_period"; then
# ex. killing cat
pkill -P "$pid" cat
fi
Комментарии:
1. pid=$(pgrep workingScript.sh) это не дает никакого результата .. Это потому, что я должен управлять workingScript.sh с помощью LD_PRELOAD с переопределенными вызовами exec* (). Любое решение без этой LD_PRELOAD?
2.
Is it because I have to run
Нет, это, скорее всего, потому, что соответствующее выражение неверно. Проверьте имя процесса и правильно сопоставьте его с ним.Any solution without this LD_PRELOAD?
Вы можете подключить отладчик или запуститьstrace -ff
(илиptrace()
) процесс для получения вызовов exec.