【目的】

父进程使用os.waitpid()等待子进程退出,并检测子进程的exit code,以决定是否重启子进程。

(常见的应用场景是:子进程接收外部命令,收到"stop"时退出所有进程,终止服务;收到"restart"时所有子进程退出,父进程重启所有子进程,以达到重启服务的目的)。

这里面的关键点在于,子进程退出时设置exit code,父进程waitpid时获取该exit code,进而决定是否需要重启子进程。

【问题】

子进程

...
#need restart
sys.exit(109)
...

父进程

...
for child in children:
pid, status = os.waitpid(child, 0)
exit_code = os.WEXITSTATUS(status)
if exit_code == 109:
restart()
...

问题在于,在子进程中通过sys.exit(109)设置了exit code为109,但父进程中os.waitpid()获取的exit code始终为0

【解决办法】

经过反复试验,发现在子进程中应该使用os._exit(109)来取代sys.exit(109)就可以了。

这两者有啥不同呢?

1. sys.exit(n) 退出程序引发SystemExit异常, 可以捕获异常执行些清理工作. n默认值为0, 表示正常退出. 其他都是非正常退出. 还可以sys.exit("sorry, goodbye!"); 一般主程序中使用此退出.
2. os._exit(n), 直接退出, 不抛异常, 不执行相关清理工作. 常用在子进程的退出.
3. exit()/quit(), 跑出SystemExit异常. 一般在交互式shell中退出时使用.

http://www.zhihu.com/question/21187839

os.waitpid()无法获取sys.exit()退出时的status code的更多相关文章

  1. Python sys模块 os模块、OS.open() | open() | OS._exit() | sys.exit() | exit()

    sys模块:负责程序和Python交互. sys常用方法:===========================  sys.stdout.write('please:')val = sys.stdin ...

  2. Linux命令之exit - 退出当前shell【返回值状态】

    原文链接:http://codingstandards.iteye.com/blog/836625   (转载请注明出处) 用途说明 exit命令用于退出当前shell,在shell脚本中可以终止当前 ...

  3. for循环、while循环、break跳出循环、continue结束本次循环、exit退出整个脚本

    7月13日任务 20.10 for循环20.11/20.12 while循环20.13 break跳出循环20.14 continue结束本次循环20.15 exit退出整个脚本扩展select用法 ...

  4. Python程序退出方式(sys.exit() os._exit() os.kill() os.popen(...))

    对于如何结束一个Python程序或者用Python操作去结束一个进程等,Python本身给出了好几种方法,而这些方式也存在着一些区别,对相关的几种方法看了并实践了下,同时也记录下. 参考: Pytho ...

  5. python之 sys.exit() os._exit() exit() quit()的简单使用

    python之sys.exit() os._exit() exit() quit()的简单使用 1>sys.exit() >>> import sys>>> ...

  6. python:sys.exit() os._exit() exit() quit()

    1>sys.exit() >>> import sys>>> help(sys.exit)Help on built-in function exit in ...

  7. os._exit(), sys.exit(), exit()

    1. sys.exit(n) 退出程序引发SystemExit异常, 可以捕获异常执行些清理工作. n默认值为0, 表示正常退出. 其他都是非正常退出. 还可以sys.exit("sorry ...

  8. Python3.x:os._exit(), sys.exit(), exit() 的区别

    Python3.x:os._exit(), sys.exit(), exit() 的区别 一.sys.exit() 说明:退出程序引发SystemExit异常, 可以捕获异常执行些清理工作.一般主程序 ...

  9. python 之 os._exit() sys.exit() 、exit()

    sys.exit 执行该语句会直接退出程序,这也是经常使用的方法,也不需要考虑平台等因素的影响,一般是退出Python程序的首选方法. 退出程序引发SystemExit异常,(这是唯一一个不会被认为是 ...

随机推荐

  1. SQL Error: 1064, SQLState: 42000

    这个错误是因为mysql有些关键字被我们用了,需要更改关键字成其他名字 ADD ALL ALTER ANALYZE AND AS ASC ASENSITIVE BEFORE BETWEEN BIGIN ...

  2. git冲突解决的方法

    在运行时,出现了冲突的报错.类似于<<<<<<< HEAD,在你改变的文件有分支与HEAD间的区别.这里就是冲突的地方. 1.解决方法一 使用命令  切换分支 ...

  3. python版GetTickCount()

    time.clock() return the current processor time as a floating point number expressed in seconds. 即返回一 ...

  4. centos python 安装 readability

    yum install libxslt-devel pip install readability-lxml

  5. jquery canvas 用户点击记录

    <div style="width:200px; height:20px; position:fixed; top:0; left:0; background-color:blue;& ...

  6. 创建jenkins任务

    前提条件 整个持续集成中用的相关的应用: gitlab (代码管理) maven(项目管理) 这些应用我们暂时全部放在了一个服务器上. 安装maven: CentOS 6.3 安装Maven3(就一步 ...

  7. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Cards Sorting(树状数组)

    Cards Sorting time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  8. Xamarin.Forms教程下载安装Windows版的Xamarin开发工具

    Xamarin.Forms教程下载安装Windows版的Xamarin开发工具 下载安装Windows版的Xamarin开发工具 本节将讲解如何下载并安装Windows版的Xamarin开发工具. 下 ...

  9. nyoj 1007 GCD(数学题 欧拉函数的应用)

    GCD 描述 The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes written (a,b) ...

  10. [BZOJ3456]城市规划(生成函数+多项式求逆+多项式求ln)

    城市规划 时间限制:40s      空间限制:256MB 题目描述 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了.  刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一 ...