Linux: отправка почты после завершения процесса или уничтожения

Я хочу получать уведомление по электронной почте после того, как процесс другого пользователя убивает или заканчивается. Я могу идентифицировать процесс другого пользователя по его идентификатору процесса или имени процесса, появляющегося в команде «top».

Чтобы сделать то же самое, я написал следующий скрипт:

while true; do if ps -ef | grep -q 'process_name'; then sleep 1 else echo "complete" | mail -s "process exiting" abc@gmail.com fi done 

Тем не менее, я считаю, что даже после завершения процесса другого пользователя или другого пользователя он убивает свой процесс, но я не получаю никаких уведомлений или сообщений электронной почты. Может кто-то, пожалуйста, помогите мне с этим немного.

Проблема, скорее всего, эта проверка:

 if ps -ef | grep -q 'process_name'; then 

Это всегда будет true . Зачем? Просто запустите его непосредственно в командной строке без -q до grep и это будет очевидно:

 $ ps -ef | grep 'process_name' user 4550 3349 0 09:17 pts/0 00:00:00 grep --colour=auto process_name $ echo $? 0 

Вышеприведенный пример показывает, что grep всегда будет успешным, потому что он найдет себя!

Есть много способов исправить это. Один из способов – использовать pgrep вместо grep .

 if pgrep 'process_name' > /dev/null; then 

Другой распространенный метод предотвращения совпадения процесса grep заключается в том, чтобы окружить одну из букв в шаблоне с помощью [] , например:

 grep -q '[p]rocess_name' 

Если вы знаете процесс, тогда вам вообще не нужен grep , вы можете использовать код выхода ps :

 if ps -p pid &> /dev/null; then sleep 1 

где pid – это, конечно, идентификатор процесса.