我想停止脚本的执行,直到进程关闭(我将PID存储在变量中)。
#!/bin/bash
outputl=$( ps -ef | grep $var4 | awk '{print $2}' ) >> $logfile
while [ "ps -p $outputl" ] > /dev/null;
do
sleep 1;
done
echo "Stopped $instance" >> $logfile
//command...
它留在"而#34;而不是继续使用whit脚本。
答案 0 :(得分:1)
这一行:
while [ "ps -p $output1" ]
不执行ps
命令。它只是测试字符串"ps -p $output1"
是否为空,显然不是。要测试命令的输出,请使用$()
:
while [ "$(ps -p "$output1")" ]
但是由于ps
产生了一个标题,所以这总是正确的。测试PID是否存在的最佳方法是使用kill
命令和信号0;这实际上并不发送信号,只是测试是否可以发送信号。我假设此代码由root
或运行正在检查的应用程序的用户标识运行。所以你可以写:
while kill -0 "$output1" 2>/dev/null
此外,您将PID转换为$output1
的代码是错误的。 ps -ef
还会包含grep
命令,该命令与您要查找的名称相匹配,因此您需要对其进行过滤。使用:
output1=$(ps -ef | grep "$var4" | awk '!/grep/ { print $2 }')
不需要将输出重定向到$logfile
,因为变量赋值不会打印任何内容。
许多系统都有pgrep
命令,可以单独使用它来测试是否存在具有给定名称的进程;如果你有这个,你可以使用它而不是重新发明轮子(如果没有,你应该能够安装它。)
答案 1 :(得分:0)
如果您有PID,则只需wait
即可完成。尝试:
outputl=$( ps -ef | awk -v v="$var4" '$0~v{print $2}' )
wait "$outputl"
echo "Stopped $instance" >> $logfile
然后寻找更好的方法在第一行找到pid。