睡眠命令后的 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 返回码更改的主要内容,如果未能解决你的问题,请参考以下文章

从C程序中的linux命令获取返回码

接口返回状态码

java如何返回各种状态码

Jenkins:hudson.plugins.git.GitException:命令“git fetch --tags --progress origin返回状态码143:

如何在 shell 中获取测试命令返回码?

unix下KSH中shell的SED命令怎样把文件中的NULL替换成空格。 (十六进制码00替换成20)