我要创建一个脚本,其目的是杀死一个进程。如果启动此进程,它会立即终止它,如果此进程未启动,它将执行无限循环,直到它检测到指定进程的存在为止(进程的名称由用户键入)。循环中的指令代码将在每次迭代时将此循环延迟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
答案 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。
您应该使用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
然而,另一个问题是如果有多个这样的过程该怎么办。
有关详细信息,请参阅Process Management。