关于程序异常返回值的疑问

sh/bash/dash/ksh/zsh等Shell脚本
回复
wgj
帖子: 294
注册时间: 2007-06-02 20:00

关于程序异常返回值的疑问

#1

帖子 wgj » 2014-04-11 22:05

最近用到timeout这个命令,需要判断执行的进程是因为超时退出还是异常退出。根据man手册上说timeout如果因为超时退出,返回124,否则返回timeout检测的程序状态。那万一程序自身异常退出返回124怎么办,有这种可能吗??进程异常退出的值有规律可循吗。谢谢各位大神。 :em06
头像
astolia
论坛版主
帖子: 6703
注册时间: 2008-09-18 13:11

Re: 关于程序异常返回值的疑问

#2

帖子 astolia » 2014-04-12 15:47

完全有可能。进程退出码是由程序自身,或者说是程序作者决定的。具体可以去看man或者查源码。

如果实在拿不准,你可以写一个保证不会返回124的中间程序,用timeout执行这个中间程序,再由中间程序去执行实际的程序,并把退出码以某种方式告知给上层脚本就行了

举个例子,这是会以124退出的a.sh

代码: 全选

#!/bin/bash -
exit 124
直接 timeout 1 a.sh后,"$?"是124没法分辨

弄个像这样的 proxy.sh

代码: 全选

#!/bin/bash -
"$@"
echo "$?" > /tmp/exitcode
exit 0
实际使用像这样

代码: 全选

timeout 1 proxy.sh a.sh
isTimeout=`test "$?" -eq 124`
exitCode=`cat /tmp/exitcode`
头像
astolia
论坛版主
帖子: 6703
注册时间: 2008-09-18 13:11

Re: 关于程序异常返回值的疑问

#3

帖子 astolia » 2014-04-12 20:11

顺便说一下,timeout命令完整的退出码说明要用info timeout查看,不仅仅是124,还有其他一些

Exit status:

124 if COMMAND times out
125 if `timeout' itself fails
126 if COMMAND is found but cannot be invoked
127 if COMMAND cannot be found
137 if COMMAND is sent the KILL(9) signal (128+9)
the exit status of COMMAND otherwise
回复