Shell Script本身会杀死自己运行的脚本进程id

时间:2016-06-08 09:30:44

标签: shell aix pid kill-process

我使用下面的命令获取pid。 “A”是应用程序名称并用作参数。我像./stop A

那样运行我的脚本
PID=`ps -ef | grep A| grep -v grep | awk '{print$2}'`

这也是捕捉“ / bin / ksh ./stop A ”过程。但我不想要。 我只想要捕获“ A ”的过程,而不是 PID /

中我的脚本过程

我的脚本下面有kill命令,它正在杀死我正在运行的脚本:(

kill -9 $PID

它也会杀死/bin/ksh ./stop A本身的pid,脚本会在此时停止。

这适用于AIX。如何避免杀死脚本本身。

注意:当我使用相同的脚本进行相同的工作但没有通过参数时,它会很好。我相信,显而易见的是,通过脚本传递参数是创建其他pid,并且对于同一个应用程序,它会执行grep和kill。

2 个答案:

答案 0 :(得分:0)

有一个名为pidof的实用程序,它列出了具有给定名称的程序实例的PID。它可以在大多数Linux机器上使用,所以它也可以在AIX上使用吗?

从手册页:

Pidof finds the process id's (pids) of the named programs.
It prints those id's on the standard output.

也:

When pidof is invoked with a full pathname to the program
it should find the pid of, it is reasonably safe.
Otherwise it is possible that  it  returns  pids  of running
programs  that  happen to have the same name as the program
you're after but are actually other programs.

答案 1 :(得分:0)

如果停止A是你所谓的杀戮的脚本,你可以做

for p in $PID
do
   test $p -ne $$ && kill -9 $p
done

请注意,包含A的所有其他进程仍然存在风险,您可以添加grep -w A来限制A是单个单词的那些

修改或没有循环

kill -9 $( ps -ef|grep -w A |grep -v -w $$ | grep -v grep | awk '{print $2}' )

(这里grep -v grep应该是不必要的)