Bash 程序id存在时如何停止脚本?Solaris

Bash 程序id存在时如何停止脚本?Solaris,bash,awk,while-loop,do-while,Bash,Awk,While Loop,Do While,我想暂停脚本的执行,直到进程关闭(我将PID存储在变量中) 它停留在“while”中,不在脚本中继续。此行: while [ "ps -p $output1" ] 不执行ps命令。它只是测试字符串“ps-p$output1”是否为空,显然不是。要测试命令的输出,请使用$(): 但是,由于ps生成了一个头,这将始终是正确的。测试PID是否存在的最佳方法是使用信号为0的kill命令;这实际上并不发送信号,它只是测试是否有可能发送信号。我假设此代码是由root或运行正在检查的应用程序的用户ID运行的

我想暂停脚本的执行,直到进程关闭(我将PID存储在变量中)

它停留在“while”中,不在脚本中继续。

此行:

while [ "ps -p $output1" ]
不执行
ps
命令。它只是测试字符串
“ps-p$output1”
是否为空,显然不是。要测试命令的输出,请使用
$()

但是,由于
ps
生成了一个头,这将始终是正确的。测试PID是否存在的最佳方法是使用信号为0的
kill
命令;这实际上并不发送信号,它只是测试是否有可能发送信号。我假设此代码是由
root
或运行正在检查的应用程序的用户ID运行的。所以你可以写:

while kill -0 "$output1" 2>/dev/null
此外,将PID设置为
$output1
的代码也错误
ps-ef
还将包含
grep
命令,该命令与您要查找的名称相匹配,因此您需要将其过滤掉。使用:

output1=$(ps -ef | grep "$var4" | awk '!/grep/ { print $2 }')
无需将输出重定向到
$logfile
,因为变量分配不会打印任何内容


许多系统都有一个
pgrep
命令,它本身可以用来测试是否存在具有给定名称的进程;如果你有这个,你可以使用它而不是重新发明轮子(如果没有,你应该可以安装它)。

如果你有PID,那么就等待它完成。尝试:

outputl=$( ps -ef | awk -v v="$var4" '$0~v{print $2}' )
wait "$outputl"
echo "Stopped $instance" >> $logfile

然后寻找更好的方法在第一行找到pid。

这也行不通。该
ps
命令仍可能生成标题行。试试这个:
而ps-p$output1>/dev/null;谢谢Barmar和Jack,你的评论非常有用,谢谢。如果你的系统有
pgrep
,那么它是正确的使用方法。如果
$outputl
中有正确的PID,你可以简单地使用
,而ps-p“$outputl”>/dev/null;做睡眠1;完成
kill-0$outputl 2>/dev/null
可能也可以工作,而且可以说工作更少(一次系统调用)。
output1=$(ps -ef | grep "$var4" | awk '!/grep/ { print $2 }')
outputl=$( ps -ef | awk -v v="$var4" '$0~v{print $2}' )
wait "$outputl"
echo "Stopped $instance" >> $logfile