如何在procces id存在的情况下停止脚本?的Solaris

时间:2017-06-08 18:23:13

标签: bash awk while-loop do-while

我想停止脚本的执行,直到进程关闭(我将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脚本。

2 个答案:

答案 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。