Bash : Найдите идентификатор родительского процесса сценария из другого сценария и выполните некоторые действия

#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.