Мониторинг запуска процесса в Linux - PullRequest
1 голос
/ 08 марта 2011

Я должен сделать скрипт, цель которого - убить процесс. Если этот процесс запущен, он немедленно завершает его, а если этот процесс не запускается, он выполняет бесконечный цикл, пока не обнаружит присутствие указанного процесса (имя процесса вводится пользователем). Код инструкции в цикле будет задерживать этот цикл на 10 секунд на каждой итерации, чтобы не чрезмерно использовать ресурсы системы. Оболочка периодически проверяет наличие или отсутствие процесса запуска. Сценарий должен заканчиваться, когда: -отслеживает запущенный процесс -или когда пользователь вышел из приложения (процесса) Пока все хорошо, когда мой скрипт обнаруживает процесс запуска, он завершает процесс и завершает работу, но не завершает работу, когда пользователь выходит из приложения, вместо этого он продолжает цикл. На самом деле я сейчас не знаю, как определить, вышел ли пользователь из приложения. Есть идеи, пожалуйста? Заранее спасибо.

#!/bin/sh

echo "Enter the name of the process to monitor "
read nom

while :
do
    compteur=` ps -u $USER | grep $nom | cut -d " " -f2 `

    if [ $compteur >0 ]
    then
        kill $compteur 
        echo " Process terminated "
        exit 1
    else
        echo " Searching $nom... "

    fi
    sleep 10;
done

Ответы [ 2 ]

0 голосов
/ 09 марта 2011

Это не сработает:

if [ $compteur >0 ]

в оболочке Bourne (#!/bin/sh) должно быть:

if [ $compteur -gt 0 ]

или в Bash (#!/bin/bash)может быть предыдущим или:

if [[ $compteur -gt 0 ]]

или

if (( compteur > 0 ))

То есть, если вы проводите числовое сравнение.Ваша команда ps ненадежна, так как начальные пробелы в PID сбрасывают ее, и вы получите ложные срабатывания по крайней мере по нескольким причинам.Кроме того, по крайней мере в моей системе ps -u username выводит PID в первом столбце.

Вы должны использовать pgrep и pkill.

Чтобы ответить на свой основной вопрос, измените свойwhile : (навсегда) до:

while pkill -0 $PID

Таким образом, ваш сценарий будет выглядеть примерно так:

#!/bin/sh

echo "Enter the name of the process to monitor "
read nom

compteur=`pgrep -U $USER "$nom"`

while pkill -0 $compteur 2>/dev/null
do
    sleep 10
    kill $compteur && echo " Process terminated "
done

Однако другая проблема состоит в том, что делать, если существует более одного такого процесса.

См. Управление процессами для получения дополнительной информации.

0 голосов
/ 09 марта 2011

Я недавно узнал, что обычно не рекомендуется убивать процессы по имени, а по идентификатору процесса (pid), что предполагает, что вы должны управлять родительскими / дочерними pids.

В вашем случае вам следует внимательно посмотретьв это , проверяя эти пункты ниже, все описано в ссылке, которую я только что дал:

  • получение идентификатора запущенного процесса

  • проверка того, что этот процесс все еще выполняется

  • ожидание постепенного завершения pid (например, обычно код состояния выхода 0)

  • убийство работающегопроцесс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...