在Linux中监视进程的启动

在Linux中监视进程的启动,linux,shell,scripting,Linux,Shell,Scripting,我将制作一个脚本,其目的是终止一个进程。如果启动此进程,它将立即终止它;如果未启动此进程,它将执行无限循环,直到它检测到指定进程的存在。进程的名称由用户键入。循环中的指令代码将在每次迭代时将循环延迟10秒,以避免过度消耗系统资源。壳牌定期检查是否有发射过程。 脚本应在以下情况下结束: -它跟踪启动的流程 -或者当用户退出应用程序进程时 到目前为止,我的脚本检测到启动进程时,它会终止进程并退出,但当用户退出应用程序时,它不会退出,而是继续循环。实际上,我现在真的不知道如何检测用户是否已退出应用程序

我将制作一个脚本,其目的是终止一个进程。如果启动此进程,它将立即终止它;如果未启动此进程,它将执行无限循环,直到它检测到指定进程的存在。进程的名称由用户键入。循环中的指令代码将在每次迭代时将循环延迟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

我最近了解到,通常不建议按名称而按进程id pid终止进程,这假定您要管理父/子pid

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

获取启动的进程id

检查该进程是否仍在运行

等待pid结束,例如通常退出状态代码0

终止正在运行的进程

这行不通:

if [ $compteur >0 ]
在伯恩贝壳里/bin/sh它需要是:

if [ $compteur -gt 0 ]
或者在狂欢节上/bin/bash它可以是上一个或:

if [[ $compteur -gt 0 ]]

也就是说,如果你在做一个数值比较。您的ps命令是不可靠的,因为PID中的前导空格将使其失效,并且您将由于至少两个原因得到误报。另外,至少在我的系统上,ps-u用户名在第一列中输出PID

您应该使用pgrep和pkill

要回答您的主要问题,请将while:forever更改为:

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
然而,另一个问题是,如果存在不止一个这样的过程,该怎么办


有关更多信息,请参阅。

您应该使用pgrep稍微简化您的脚本。当用户退出应用程序进程时,您的意思是该进程在10秒内启动并完成,您的脚本正在休眠?在我的脚本休眠的10秒内,如果用户打开,使用或不使用并在10秒内关闭应用程序,程序应退出。我知道这听起来可能不太实际。我可以增加到一分钟左右。谢谢丹尼斯的提示和更正。实际上,我的老师不希望我们使用pgrep和pkill。她想让我们利用管道、SED、GREP等等。我已经尝试过使用{if[$compteur-gt 0]}和{if test$compteur-gt 0}但是它给了我这个错误:-gt:意外运算符。这就是为什么我把它改为if[computer>0],并且由于某种原因它可以工作guess@mkab:[compteur>0]创建一个名为0的文件,通常返回true。试试a=-1;如果[$a>0];然后回声‘等等!负一不应大于零;fi;ls-l 0是的,它确实创建了一个名为0的文件,并在if循环中执行了函数,但它不应该这样做,因为-1永远不会大于0。这意味着if条件总是正确的。我现在明白了。还有一件事:如何知道脚本中的变量是字符串还是数字,以便在if循环中使用适当的测试?我把java和shell脚本混合在一起。例如,java中的变量可以包含一个数字字符串str=4453。明白我的意思了吗?@mkab:在Unix shell中,变量默认为字符串,而不管其内容如何。可以声明-i varname将其类型设置为integer。无论值是字符串还是数字,进行字符串比较总是安全的。如果您想验证一个变量是否包含一个数字,并且您还没有使用declare-i,那么有多种方法可以做到这一点。如果[[$var==$var]]&&var>0,可以这样做;则回波var大于零;如果第一个测试失败,它将跳过第二个测试。酷。非常感谢你的帮助。
#!/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