睡眠命令后的 Unix 返回码更改
Posted
技术标签:
【中文标题】睡眠命令后的 Unix 返回码更改【英文标题】:Unix return code changes after sleep command 【发布时间】:2013-02-28 09:53:58 【问题描述】:stop()
sh stop.sh
ret_code=$?
<1>echo ret_code is $ret_code
once=true
while $once
do
stop & PID=$!
<2>echo ret_code is $ret_code
sleep 2m
<3>echo ret_code is $ret_code
if [ $ret_code == 0 ]
then
break
else
kill $PID
fi
done
处的 ret_code 为 0
处的 ret_code 不打印
处的 ret_code 为空白
有人能说出为什么在 sleep 命令期间和之后会更改 ret_code 值吗?
编辑:
我尝试了另一种方法。成功了——
#! /bin/sh
once=true
while $once
do
sh stop.sh & PID=$!
sleep 2m
kill $PID
if [ $? != 0 ]
then
echo stop has completed successfully within the time limit
echo starting ...
sh start.sh
break
fi
done
【问题讨论】:
1) 第 3 行的 stop.sh 是什么? 2) 你能调整回显语句以包括“1.”、“2.”吗?等等,请包括脚本的输出? @AshBerlin 这是另一个实际上停止服务的 shell 脚本。它通常运行良好,因此 rc 通常为 0。但有时它会卡住,因此这种编写简单停止/启动过程的复杂方式 @AshBerlin 代码中实际上并不存在这些数字,我只是在此处添加它们以提高可读性。我目前无法访问该程序,但这就是发生的事情 - 睡眠后,它进入“其他”部分并试图终止该进程。过程显然不再存在。所以它会回到“停止”并继续以相同的方式循环。 这是一个准确的说法吗:你想运行 stop.sh,如果它没有在 2 秒内完成就将其杀死,并记录其退出状态? 【参考方案1】:stop
作为后台进程,在子shell 中运行,因此它设置的ret_code
的值与您在 和 中签入的值不同(应该相同,因为它的值不受sleep
命令的影响)。
【讨论】:
我明白了!那么有没有办法在子shell中使用变量呢? 忽略之前的愚蠢评论 :) - 我可以从子 shell 导出变量以在主 shell 中使用,对吧?以上是关于睡眠命令后的 Unix 返回码更改的主要内容,如果未能解决你的问题,请参考以下文章
Jenkins:hudson.plugins.git.GitException:命令“git fetch --tags --progress origin返回状态码143: