监控Linux中的进程启动

时间:2011-03-08 20:48:06

标签: linux shell scripting

我要创建一个脚本,其目的是杀死一个进程。如果启动此进程,它会立即终止它,如果此进程未启动,它将执行无限循环,直到它检测到指定进程的存在为止(进程的名称由用户键入)。循环中的指令代码将在每次迭代时将此循环延迟10秒,以免过度消耗系统的资源。 shell定期检查启动过程的存在与否。 该脚本应在以下时间结束: -it跟踪已启动的进程 - 或者当用户退出应用程序(进程)时 到目前为止,当我的脚本检测到启动过程时,它终止了进程和退出,但是当用户退出应用程序而不是继续循环时它不会退出。实际上我现在还不知道如何检测用户是否已退出应用程序。有什么想法吗?提前谢谢。

#!/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 :(得分:0)

我最近了解到,通常不建议按名称杀死进程,而是通过进程ID(pid)来禁止进程,这会假定您管理父/子进程。

在您的情况下,您应该仔细查看this,检查以下这些点,所有这些都在我刚刚给出的链接中描述:

  • 获取已启动的流程ID

  • 检查该流程是否仍在运行

  • 等待pid优雅结束(例如通常退出状态代码0)

  • 终止正在运行的进程

答案 1 :(得分:0)

这不会起作用:

if [ $compteur >0 ]
在Bourne shell(#!/bin/sh)中的

需要:

if [ $compteur -gt 0 ]

或在Bash(#!/bin/bash)中,它可以是前一个或:

if [[ $compteur -gt 0 ]]

if (( compteur > 0 ))

也就是说,如果您正在进行数字比较。你的ps命令是不可靠的,因为PID中的前导空格会将其丢弃,至少有几个原因你会得到误报。此外,至少在我的系统上,ps -u username在第一列输出PID。

您应该使用pgreppkill

要回答您的主要问题,请将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

然而,另一个问题是如果有多个这样的过程该怎么办。

有关详细信息,请参阅Process Management