Linux 我是否可以等待不是当前shell终端子级的进程终止?

Linux 我是否可以等待不是当前shell终端子级的进程终止?,linux,shell,awk,process,kill,bash,Linux,Shell,Awk,Process,Kill,Bash,我有一个脚本,它必须杀死由高可用性中间件管理的资源若干次。它基本上是检查资源是否正在运行,然后将其杀死,我需要进程何时真正被杀死的时间戳。所以我做了以下代码: #!/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/has

我有一个脚本,它必须杀死由高可用性中间件管理的资源若干次。它基本上是检查资源是否正在运行,然后将其杀死,我需要进程何时真正被杀死的时间戳。所以我做了以下代码:

#!/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的子进程,我假设您从启动子进程,然后启动这个脚本等待。问题在于,子进程不是运行脚本的子进程,而是其父进程的子进程

如果要在当前脚本中启动脚本,应从
开始

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

$ 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中,您可以使用类似于以下内容的方法来获取pid,这样就可以避免整个管道
  • 要从中调用外部程序,可以尝试
    system(“mycmd”)内置
我希望这有点帮助