我正在用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
为什么会这样?或者如何预防
你在泄露僵尸进程
当您在Docker容器中运行时,您的进程的进程ID为1。这意味着如果容器中的某个对象被终止,并且其父进程不见了(例如,因为它通过双叉成为守护进程),您的进程将成为其新的父进程,您将负责等待它(2)。如果不这样做,就会出现这样的僵尸进程
一个直接的答案可能是在发出“kill”之后^{} 。这将导致您等待下一个退出并执行所需的清理
不过,如果不这么间接地进行清理,那就更干净了。您可以使用^{} 来创建一个进程,而不是将子进程作为守护进程启动并稍后尝试清理。您可以让进程“在前台”运行,但不能阻止它在Python进程中完成。看起来像是
如果你能把东西分开,让这两件东西放在不同的容器里,那就更好了;这样你就可以避免这个管理问题
(…当
config_file = "/dev/null; cat /etc/shadow"
发生什么?尽量避免使用字符串形式的命令,如os.system()
(如果可能的话)相关问题 更多 >
编程相关推荐