2016-01-10 2 views
1

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

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

while true; do 
    if ps -ef | grep -q 'process_name'; then 
    sleep 1 
    else 
    echo "complete" | mail -s "process exiting" [email protected] 
    fi 
done 

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

+0

Действительно ли это точный код, который вы используете? Вы отправляете «полную» почту в бесконечном цикле, что может привести к блокировке вашего адреса или хоста ... – mata

+0

@mata Да, это код, который я использую –

+0

@mata Есть ли способ, которым я могу исправить мой код –

ответ

3

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

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 
+0

Есть ли способ, с помощью которого я могу указать идентификатор процесса вместо имени процесса –

+0

Да, вы можете сделать это с помощью 'kill -0', который просто проверяет, существует ли pid. То есть: 'if kill -0 $ pid 2>/dev/null; then' – kaylum

+0

Есть ли способ сопоставления значения «команда». Например, в выражении IF выше, используя сопоставление строк, равное значению «команда»? – neo

2

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

grep -q '[p]rocess_name' 

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

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

где ПИД- конечно идентификатор процесса.

+0

Ничего себе, аккуратный. Не знал об этой маленькой жемчужине. – kaylum

+0

Есть ли способ, с помощью которого я могу указать идентификатор процесса вместо имени процесса –

+0

@JannatArora в этом случае есть лучший способ, чем grep, используя только ps, см. Мой обновленный ответ – janos

Смежные вопросы