我有一个脚本必须杀死由高可用性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的孩子
答案 0 :(得分:1)
我假设您从bash启动子进程,然后启动此脚本等待。问题是子进程不是运行脚本的bash的子进程,而是其父进程的子进程!
如果您想在当前bash内启动一个脚本,您应该从.
开始。
一个例子。您开始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
当第一个版本创建新的bash会话时,不会列出任何作业。但是使用.
脚本在当前bash脚本中运行,只有一个chold进程(即vim
)。因此,请使用.
启动上面的脚本,这样就不会创建任何子bash。
请注意,定义任何变量或更改目录(以及更多内容)都会影响您的环境!例如。调用bash!
可以看到PID<强>注释:强>
...|grep ...|grep -v ... |awk ---
管蛇!请改用...|awk...
!ps -o pid= -C pcmAppBin
的内容来获取pid,因此可以避免使用完整的管道。system("mycmd");
内置我希望这有点帮助!