我在使用python中的子进程来启动一个程序。当它启动时它会保存在数据库中创建的进程的pid。一段时间后,如果触发器发生,它需要停止这个进程,开始一个新的。 问题是,当我使用subprocess.Popen()。pid它会返回一个僵尸进程的PID(已停用),而不是真正的进程,我需要停止。自启动进程命令和kill之后,我无法使用terminate命令命令发生在不同的脚本中。所以我需要一种方法来获得我开始的过程的真正pid,而不是僵尸进程的pid。在python中使用pid来杀死子进程
0
A
回答
0
僵尸进程是一个死进程,它的数据仍然由os保存并返回到调用进程(退出值等)。你不能杀死一个僵尸进程,因为它已经死了。有两种方法可以摆脱它;或者Popen.wait()
用于在父节点退出前从其父节点获取子流程,或者在后台节点使用Popen.poll()
(如果父流程应该继续运行),或者终止所有父流程,直到僵尸的父节点为1 init
,并且init将自动收获。然后你应该更新你的数据库,你的进程退出,因为linux可能会给一个新的不相关的进程提供相同的pid(你最终会杀死一个你不打算杀死的进程)。
如果您只需要停止该过程,那么请不要担心 - 它已停止。但是,你需要担心系统中有太多的僵尸(有些人甚至认为1太多),因为linux会为每个进程发出一个pid,并且其中太多会阻止你运行新的流程。
有一个强制父进程收割他们的子女的黑客here。
相关问题
- 1. 通过PID在Erlang中杀死进程
- 2. 使用Unix中最低的PID来杀死进程
- 3. 如何从pid文件中查杀时杀死子进程
- 4. 使用名称而不是PID来杀死JVM进程
- 5. 如何使用pid杀死Node.js子进程?
- 6. 如何杀死一个PID在PID文件中的进程?
- 7. 杀死进程和PID回收
- 8. Linux杀死进程kill -9 PID
- 9. 用python杀死进程
- 10. 在python中用ppid杀死进程?
- 11. 如何使用pid从php中杀死一个linux进程?
- 12. 在子进程中使用红宝石杀死分叉进程
- 13. 杀死进程杀死其他进程
- 14. Python - 不能杀死进程
- 15. 杀死一个python进程
- 16. 而不杀死Python进程
- 17. .kill()在python子进程中杀死父进程而不是子进程
- 18. 无法在Python中杀死airodump进程
- 19. 杀死Popen子进程
- 20. 杀死子进程清除
- 21. 后来在Python中杀死线程
- 22. 使用其名称而不是PID杀死java进程
- 23. 如何杀死一个进程使用VB.NET特定PID`
- 24. 我使用PID创建一个杀死进程
- 25. 杀死在while循环后台进程中创建的PID
- 26. 获取杀死我的应用程序的进程的PID
- 27. 在Mysql中杀死进程?
- 28. 杀死进程
- 29. 杀死进程
- 30. 杀死进程
我只想得到正确的PID过程而不是僵尸的PID。我不认为我可以接受这个答案。无论如何谢谢。 – vkefallinos
您拥有正确的pid。没有其他的PID。这个过程从一个pid开始,然后退出。该pid不会改变。你得到了正确的pid,但没有什么可以做到的,除了上述以外。 – micromoses
也许[this](https://www.google.co.il/#q=what+is+a+zombie+process)会有所帮助。 – micromoses