例如用 socket 在某端口绑定了一个监听服务,然后用 os.fork 分裂出多个节点。
如果其中一个进程挂了,这种情况下主进程有什么办法可以监控和恢复吗?
1
ysc3839 2023-02-22 02:33:48 +08:00 via Android
SIGCHLD
|
2
mingl0280 2023-02-22 04:05:35 +08:00 via Android
fork 完了有 pid 的,直接拉 pid 列表看看是不是死了呗
|
3
ruanimal 2023-02-22 07:52:35 +08:00
其实好奇,既然你想自己 fork 那么你就用 c 的写法啊,为啥有这个问题呢?
或者用 ForkingTCPServer |
4
wheeler 2023-02-22 08:12:55 +08:00 via iPhone
不能直接 supervisord systemd 吗
|
5
julyclyde 2023-02-22 08:37:23 +08:00
你自己 fork 那就只能自己 SIGCHLD 了
ForkingTCPServer 、ThreadPoolExecutor 之类的都是作一些简化,但是本质上还是一样的 |
6
rationa1cuzz 2023-02-22 09:12:37 +08:00
我们以前是起个线程去看,挂了化去重新拉起来
|
7
lolizeppelin 2023-02-22 10:14:53 +08:00 1
对 linux 不够熟不要自己写一套
最佳实践参考 openstack 服务库的 oslo_service 里面有 linux 下多进程的标准管理方式以及可用代码 |
8
Richard14 OP @ysc3839
@mingl0280 @ruanimal @julyclyde @rationa1cuzz @lolizeppelin 感谢回复,我目前其实没把进程玩挂过,前端加了限峰,只是考虑作为一个长期运行撒手不管的服务的话,我没法预期它会不会有什么期望外的行为,想做比较成熟的应用的话应该考虑挂了拉起的情况。但是听各位说的感觉似乎是主进程会接收子进程挂起信号,但是我不太了解比如 win 平台下进程挂了就是未响应,这种进程还会发信号吗?另外如果参考 linux 下其他代码的话,毕竟这是 python 程序。。叫我参考 C 的代码我不太懂两者怎么结合起来。 @wheeler 直接用三方程序的话有一个问题就是三方程序只能监管一个进程的资源,比如我一个绑定 10086 端口的服务有 10 个 fork 进程,这些子进程应该是监控不到,只有主进程挂了三方监控才会重新拉起吧?如果直接开 10 个主进程的话,没办法绑定到同一监听端口啊 |
9
ClericPy 2023-02-22 18:38:13 +08:00
进程不是有 wait 么, 不能用 wait 吗... 我管理几十个 chrome 进程用的就是 wait, 看它的 return code 就知道是不是正常退出, 而且反应速度也挺不错的. 不放心再加个验活就好了, 验活可以用 poll 也可以用 os.kill 0 的方式
|