【问题标题】:How to make a child process survive service shutdown?如何使子进程在服务关闭后幸存下来?
【发布时间】:2020-09-28 18:14:33
【问题描述】:

script1.py:

#do somthing
os.system('nohup python3 -u script2.py {} {} >> {}.out &'.format(xxx, yyy, zzz))
#do somthing

script2.py: 此 scipt 始终使用 loop.run_forever()

运行

当 script1 作为服务运行时,此脚本正确运行 script2。 但是如果我用 'kill pid' 命令杀死 Script1,Script2 也会被自动杀死,这是我不希望的,我希望 Script2 继续工作。

编辑:我使用systemd 运行script1.py

【问题讨论】:

  • 您使用的是哪个具体的流程监管系统?如果它是 systemd,f/e,则有关于如何杀死孩子的可配置选项。如果您正在使用的任何进程监控系统正在关闭整个 cgroup,nohup 不会做任何事情来切换 cgroup,所以您就可以了。
  • 顺便说一句,使用os.system 通常是不受欢迎的——subprocess 模块是一个严格的超集:它可以做任何事情 os.system 可以做很多事情,很多更多(包括,重要的是,不调用 shell;如果 xxxyyyzzz 是用户控制的,则上面的代码容易出现严重的安全问题;要在仍然使用 shell 的同时解决这个问题,您需要替换在shlex.quote(xxx),而不仅仅是xxx)。
  • @charles-duffy 嗨,谢谢,所以我使用子进程。还有关于我的问题,我使用 systemd 你能更全面地解释一下我应该怎么做吗?
  • 查看 systemd 中的 KillMode 选项。将其设置为process 是最保守的选择,就最不可能杀死除您自己的进程之外的事物而言的方法而言。如果您在问题中编辑您使用 systemd 的详细信息,我会将其添加为答案。
  • 谢谢,我编辑了

标签: python systemd nohup


【解决方案1】:

如果您希望您开始的子进程不被 systemd 杀死,请更改为您的服务配置的 KillMode。因此,在您的服务文件中:

[Service]
KillMode=process

默认值为KillMode=control-group,这样systemd会杀死它为服务创建的cgroup中的所有东西;而nohup 对 cgroups 一无所知。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多