我正在编写代码来杀死一个进程和所有子进程。
根据这篇文章,可以使用以下命令杀死同一进程组中的所有子进程os.killpg(pro.pid, signal.SIGTERM)
在测试期间,我手动启动了这个进程,它产生了 5 个子进程。
UID PID PPID C STIME TTY TIME CMD
ddd 25066 19475 0 Nov03 ? 00:00:00 /bin/sh -c gtdownload -c ~/.cghub.key --max-children 4 -vv -d https://cghub.ucsc.edu/cghub/data/analysis/download/ab0e89b4-5310-11e4-88da-adc9fc308db6 2
ddd 25067 25066 0 Nov03 ? 00:00:07 /rsrch1/rists/djiao/apps/cghub/libexec/gtdownload -c /rsrch1/rists/djiao/.cghub.key --max-children 4 -vv -d https://cghub.ucsc.edu/cghub/data/analysis/d
ddd 25073 25067 0 Nov03 ? 00:00:18 /rsrch1/rists/djiao/apps/cghub/libexec/gtdownload -c /rsrch1/rists/djiao/.cghub.key --max-children 4 -vv -d https://cghub.ucsc.edu/cghub/data/analysis/d
ddd 25077 25067 0 Nov03 ? 00:00:18 /rsrch1/rists/djiao/apps/cghub/libexec/gtdownload -c /rsrch1/rists/djiao/.cghub.key --max-children 4 -vv -d https://cghub.ucsc.edu/cghub/data/analysis/d
ddd 25081 25067 0 Nov03 ? 00:00:18 /rsrch1/rists/djiao/apps/cghub/libexec/gtdownload -c /rsrch1/rists/djiao/.cghub.key --max-children 4 -vv -d https://cghub.ucsc.edu/cghub/data/analysis/d
ddd 25085 25067 0 Nov03 ? 00:00:18 /rsrch1/rists/djiao/apps/cghub/libexec/gtdownload -c /rsrch1/rists/djiao/.cghub.key --max-children 4 -vv -d https://cghub.ucsc.edu/cghub/data/analysis/d
Run Code Online (Sandbox Code Playgroud)
但是,当我运行 os.killpg(25066, signal.SIGTERM) 时,出现错误“OSError: [Errno 3] No such process”。为什么找不到那个ID的进程?
您需要os.setpgrp()在调用之前使用设置进程组os.killpg()。如果您没有设置任何进程组,那么您将无法使用以下命令杀死它os.killpg()
您可以使用以下方式创建进程组:
os.setpgrp()-- 如果没有传递参数则相当于 os.setpgrp(0,0)。这将创建一个 id 与调用进程 id 相同的进程组。os.setpgrp(0, 999)-- 它将创建一个 ID 为 999 的进程组,当前进程将成为该组的一部分。您可以使用任何进程 ID 而不是 0,使其成为该进程组的一部分。os.setpgrp()实际上调用的是linux系统调用setpgrp()。有关详细信息,请参阅以下 Linux 手册页:
https: //linux.die.net/man/2/setpgrp
http://man7.org/linux/man-pages/man2/setpgid.2.html
| 归档时间: |
|
| 查看次数: |
2265 次 |
| 最近记录: |