这是我的foobar.sh的代码:
!#/bin/bash
while [ 1 ]
do
pid=`ps -ef | grep "mylittleprogram" | grep -v grep | awk ' {print $2}'`
echo $pid
if [ "$pid"="" ]
then
echo "Process has ended lets get this show on the road..."
exit
else
echo "Process has not ended yet"
fi
sleep 6
done
我基本上运行一个infinate循环,一旦受监视的进程结束就会执行命令X但是当我的脚本循环时我最终得到以下消息:
./foobar.sh: line 7: [: missing `]'
Process has not ended yet
有没有办法让脚本接受零反馈会触发我的'Then'语句并执行命令X,因为它不喜欢当前的方法。
答案 0 :(得分:10)
而不是
if [ "$pid"="" ]
请尝试
if [ "$pid" = "" ]
空格大约=
很重要。
您也可以尝试
if [ -z "$pid" ]
答案 1 :(得分:3)
我会做
while pgrep -fl "mylittleprogram"; do sleep 6; done
exit # process has ended
(pgrep在包psmisc
IIRC中)
我刚试过它。如果您希望等待静音,可以将pgrep
的输出重定向到/dev/null
。添加更多香料,使事物不间断:
{
trap "" INT
while pgrep -fl "mylittleprogram" >/dev/null
do
sleep 6
done
true
} && exit
答案 2 :(得分:1)
零测试是if [ -z "$pid" ]
答案 3 :(得分:0)
而不是由:
提供的模糊匹配pid=`ps -ef | grep "mylittleprogram" | grep -v grep | awk ' {print $2}'`
...和古老的反引号语法,请考虑这与进程基本名称完全匹配,并生成您选择的输出格式(此处为进程pid,如果存在):
pid=$(ps -C mylittleprogram -opid=)
然后,如上所述,只需测试一个空值:
[ -z "${pid" ] && echo "no process" || echo "I live as $pid"
输出元素名称后面的等号会抑制您通常会得到的标题。联机帮助页是你的朋友。