docker中的Killing进程离开内核线程

2024-10-04 11:22:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Docker做实验,解决了我的大部分问题,但这个问题我不能让步

我有一个python应用程序,它定期在docker中打开vpn(通过openvpn客户端),做一些事情,然后就可以了

os.system("pkill -f openvpn")
#os.system("killall openvpn")

我尝试过这两种方法,它们都可以在独立系统上正常工作,但在docker中,每次openvpn恶魔被杀死时,它们都会留下内核线程(?)

Openvpn客户端在脚本中的调用方式如下:

os.system("/usr/sbin/openvpn --daemon --config " + config_file)

但每次被杀的ps都会得到一个[openvpn]

/app # ps auxf
PID   USER     TIME  COMMAND
    1 root      0:01 python app.py
    9 root      0:00 [openvpn]
   10 root      0:00 [openvpn]
   16 root      0:00 sh
   41 root      0:00 [openvpn]
   42 root      0:00 [openvpn]
   57 root      0:00 [openvpn]
   58 root      0:00 [openvpn]
   75 root      0:00 [openvpn]
   76 root      0:00 [openvpn]
   89 root      0:00 [openvpn]
   90 root      0:00 [openvpn]
  106 root      0:00 [openvpn]
  107 root      0:00 [openvpn]
  123 root      0:00 [openvpn]
  124 root      0:00 [openvpn]
  137 root      0:00 [openvpn]
  138 root      0:00 /usr/sbin/openvpn --daemon --config /etc/openvpn/VPNarea/Poland-Warsaw.ovpn
  145 root      0:00 ps auxf

为什么会这样?或者如何预防


Tags: dockerconfigapp应用程序客户端osusrroot
1条回答
网友
1楼 · 发布于 2024-10-04 11:22:48

你在泄露僵尸进程

当您在Docker容器中运行时,您的进程的进程ID为1。这意味着如果容器中的某个对象被终止,并且其父进程不见了(例如,因为它通过双叉成为守护进程),您的进程将成为其新的父进程,您将负责等待它(2)。如果不这样做,就会出现这样的僵尸进程

一个直接的答案可能是在发出“kill”之后^{}。这将导致您等待下一个退出并执行所需的清理

不过,如果不这么间接地进行清理,那就更干净了。您可以使用^{}来创建一个进程,而不是将子进程作为守护进程启动并稍后尝试清理。您可以让进程“在前台”运行,但不能阻止它在Python进程中完成。看起来像是

vpn = subprocess.Popen(["/usr/sbin/openvpn", " config", config_file])
...
vpn.kill()
vpn.wait()

如果你能把东西分开,让这两件东西放在不同的容器里,那就更好了;这样你就可以避免这个管理问题

(…当config_file = "/dev/null; cat /etc/shadow"发生什么?尽量避免使用字符串形式的命令,如os.system()(如果可能的话)

相关问题 更多 >