我能等待一个不属于当前shell终端的进程终止吗?(该进程与当前shell终端没有父子关系)

3

我有一个脚本,需要多次杀死由高可用中间件管理的资源。它基本上检查资源是否正在运行并在之后终止它,我需要获得进程真正被杀死的时间戳。因此,我编写了以下代码:

#!/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: pid xxxx 不是此 shell 的子进程

1个回答

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

作为第一个版本,创建一个新的 会话,没有列出任何作业。但是使用 .,脚本将在当前 脚本中运行,仅有一个子进程(即 vim)。因此,请使用 . 启动上述脚本,以便不创建任何子

请注意,定义任何变量或更改目录(以及许多其他操作)都会影响您的环境!例如,PID 将可被调用的 看到!

评论:

  • 不要使用...|grep ...|grep -v ... |awk ---管道符!使用...|awk...代替!
  • 在大多数Linux操作系统中,您可以使用类似于ps -o pid= -C pcmAppBin的命令来获得pid,因此可以避免完整的管道。
  • 要从中调用外部程序,您可以尝试system("mycmd");内置命令

希望这可以帮助您一些!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接