我可以等待一个不是当前shell终端子进程的进程终止吗?

时间:2014-11-15 22:19:34

标签: linux shell awk process kill

我有一个脚本必须杀死由高可用性middelware管理的资源的特定次数。它基本上检查资源是否正在运行并在之后杀死它,我需要时间戳来确定proc被杀死的时间。所以我完成了这段代码:

#!/bin/bash
echo "$(date +"%T,%N") :New measures Run" > /home/hassan/logs/measures.log
for i in {1..50}

do
    echo "Iteration: $i"
    PID=`ps -ef | grep  "/home/hassan/Desktop/pcmAppBin pacemaker_app/MainController"|grep -v "grep" | awk {'print$2'}`
    if [ -n "$PID" ]; then
        echo "$(date +"%T,%N") :Killing $PID" >> /home/hassan/logs/measures.log
        ps -ef | grep  "/home/hassan/Desktop/pcmAppBin pacemaker_app/MainController"|grep -v "grep" | awk {'print "kill -9 " $2'} | sh
        wait $PID
    else
        PID=`ps -ef | grep  "/home/hassan/Desktop/pcmAppBin pacemaker_app/MainController"|grep -v "grep" | awk {'print$2'}`
        until [ -n "$PID" ]; do
                sleep 2
        PID=`ps -ef | grep  "/home/hassan/Desktop/pcmAppBin pacemaker_app/MainController"|grep -v "grep" | awk {'print$2'}`
        done
    fi

done

但是使用我的wait命令我收到以下错误消息:wait:pid xxxx不是这个shell的孩子

1 个答案:

答案 0 :(得分:1)

我假设您从启动子进程,然后启动此脚本等待。问题是子进程不是运行脚本的的子进程,而是其父进程的子进程!

如果您想在当前内启动一个脚本,您应该从.开始。

一个例子。您开始vim,然后您停止按^Z(稍后您可以使用fg返回vim)。然后,您可以使用˙jobs命令获取作业列表。

$ jobs
[1]+  Stopped                 vim myfile

然后您可以创建一个名为test.sh的脚本,其中只包含一个名为jobs的命令。添加执行权限(例如chmod 700 test.sh),然后启动它:

$ cat test.sh 
jobs
~/dev/fi [3:1]$ ./test.sh
~/dev/fi [3:1]$ . ./test.sh 
[1]+  Stopped                 vim myfile

当第一个版本创建新的会话时,不会列出任何作业。但是使用.脚本在当前脚本中运行,只有一个chold进程(即vim)。因此,请使用.启动上面的脚本,这样就不会创建任何子

请注意,定义任何变量或更改目录(以及更多内容)都会影响您的环境!例如。调用

可以看到PID

<强>注释:

  • 不要使用...|grep ...|grep -v ... |awk ---管蛇!请改用...|awk...
  • 在大多数Linux-es中,您可以使用类似ps -o pid= -C pcmAppBin的内容来获取pid,因此可以避免使用完整的管道。
  • 要从拨打外部程序,您可以尝试system("mycmd");内置

我希望这有点帮助!

相关问题