BinaryTom

导航

linux执行命令返回值问题

返回值引起的一次问题

问题起始于一次命令调用出错,获取返回值为零的情况。在此做个记录。一个严谨的程序最少应该有两个返回值,零和非零,分别用来表示正常和异常的执行。

  • 问题背景:在linux中执行python脚本,脚本中使用cmd调用hive -e来执行hive sql,脚本使用命令的exit code退出。可是有几次异常退出后,python脚本执行的返回值为零,导致其他模块认为执行成功,不做处理。
  • 问题定位:在log中找到exit code,发现不为零。觉得应该是linux的返回值问题。发现exit code大于255而且刚好为256的整数倍。
  • 问题分析:linux的返回码为一个Byte(8位),即0~255,大于255则取模。

关于linux和c语言的exit code

exit code

都调用了系统调用的_exit,_exit函数中status参数定义了进程的终止状态,父进程可以通过wait()来获取该状态值。需要注意的是返回值,虽然status是int型,但是仅有低8位可以被父进程所用。所以写exit(-1)结束进程时,在终端执行“$?”会发现返回值是255。

退出状态码的约定

如果是shell相关的编程,退出值最好不要大于128,POSIX标准规定了退出状态和含义如下:

  • 0,命令执行成功
  • 1~125之间是由各个命令自己定义的。
  • 126,命令找到,文件无法执行
  • 128以上的返回值,是由内核来管理的,比如用中断信号终止一个程序运行,该程序的返回值就是130

posted on 2018-10-11 16:22  BinaryTom  阅读(460)  评论(0编辑  收藏  举报