【问题标题】:Shell Script itself killing own running script process idShell 脚本本身杀死自己的运行脚本进程 id
【发布时间】:2016-10-08 11:46:36
【问题描述】:

我正在使用以下命令来获取 pid 。 “A”是应用程序名称并用作参数。我像 ./stop A 一样运行我的脚本

PID=`ps -ef | grep A| grep -v grep | awk '{print$2}'`

这也在捕获“/bin/ksh ./stop A”过程。但我不想要。 我只想在 PID/

中捕获“A”进程而不是我的脚本进程

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

kill -9 $PID

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

这是针对 AIX 的。如何避免杀死脚本本身。

注意:当我使用相同的脚本做相同的工作但没有传递参数时,它会很好。我相信它很明显,因为将参数传递给脚本正在创建其他 pid,而对于同一个应用程序,它会执行 grep 和杀戮。

【问题讨论】:

  • 您可以通过-wps -ef | grep -w "A" | grep -v grep | awk '{print$2}' 使grep 搜索独一无二?
  • 在 AIX 中不工作。它仍在捕获脚本进程本身并将其杀死。

标签: shell aix pid kill-process


【解决方案1】:

如果停止 A 是您调用 kill 的脚本,您可以这样做

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 应该是不必要的)

【讨论】:

  • 我们可以这样做吗? 1) 通过 PID=ps -ef | grep A| grep -v grep | awk '{print$2}' 捕获 pid 2) 在第一步本身中执行 -ne $$ ?这样脚本 pid 本身就不会保存在“PID”中
  • 你的意思是没有循环?但是,如果您的 ps ... 的结果是两个 pid,那又如何呢?它总是满足-ne 并且会杀死两者
  • aaah klickediclick - 你的意思是像ps -ef|grep -w A |grep -v grep|grep -v -w $$ | awk ... 我认为这也应该是可能的!还不错
  • 不在循环内。我的意思只是在 PID=ps -ef | 行中丢弃该 pid。 grep | grep -v grep | awk '{print$2}' 本身 > 如果完成,这将非常有帮助,而且我们不必不必要地使用其他逻辑来过滤它。
  • 查看评论和编辑 - 没有循环并在 grep 中直接拉出 $$ pid
【解决方案2】:

有一个名为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.

【讨论】:

  • 在 AIX 中不可用。
  • 除非我使用没有参数的脚本,否则它会杀死正确的 pid。但为了使其更通用,我添加了参数选项。之后我得到了这个问题。我的脚本很长,它还做了很多与我的应用程序相关的事情。 :(
  • @RishuA:我建议的选项有什么问题?为了进一步帮助你,你能告诉我手动运行命令ps -ef | grep -w "A" | grep -v grep 时的输出是什么它应该只返回进程A的进程ID
  • @Inian,我来解释一下。当您运行任何带有参数的脚本时,它也会为自己生成一个 pid。在这种情况下,我的参数是 A 并且我正在寻找 A 。所以它也在捕获我的“./script A”的pid,当我们使用-w“A”时,它仍然会捕获脚本pid,因为脚本是由参数“A”本身运行的。参考输出:XXX11075780 10879170 0 06:18:11 pts/3 0:00 /bin/ksh ./stop.sh A
  • 好的,同意,可以使用pgrep,你能看看pgrep -f "A"是否正在返回应用程序A的pid吗?因为pgrepregex 上工作。例如pgrep -f "ssh"
猜你喜欢
  • 2013-03-26
  • 1970-01-01
  • 2016-07-08
  • 2010-12-23
  • 2012-09-30
  • 2013-11-11
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
相关资源
最近更新 更多