2015-11-04 36 views
2

我正在寫代碼來殺死進程和所有子進程。什麼PID os.killpg尋找

根據this post,所有兒童過程可以在同一過程中組內通過使用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 

然而,當我跑os.killpg(25066,signal.SIGTERM),I得到了錯誤 「OSERROR:[錯誤3]沒有這樣的過程」。爲什麼找不到具有該ID的流程?

+0

在鏈接後,你有沒有看到他們怎麼叫'Popen'?特別是'preexec_fn = os.setsid'很重要。 –

+0

我認爲這一步只是啓動過程。一旦啓動,它將會分配一個PID。在我的真實代碼中,我確實使用了Popen和setsid。我只是想首先測試killpg並查看它實際上殺死了什麼 – Nasreddin

+1

'killpg'向進程組中的所有進程發送信號,並獲取進程組ID。 'setsid'創建一個新的進程組,其id等於進程的PID。如果你不運行'setsid',將不會有'killpg'發送到的進程組(因此發生錯誤)。 –

回答

0

在調用os.killpg()之前,您需要使用os.setpgrp()來設置進程組。 如果不設置任何進程組,那麼你將無法使用os.killpg()

您可以使用以下方式創建進程組要殺死它:

  1. os.setpgrp() # If no argument is passed then it is equivalent to os.setpgrp(0,0). This will create a process group with id same as the calling process id.
  2. os.setpgrp(0, 999) #It will create a process group with id 999 and the current process will be part of that group. You can use any process id instead of 0 to make it part of that process group.

os.setpgrp()實際上調用linux系統調用setpgrp()。詳細請參見以下Linux手冊頁: https://linux.die.net/man/2/setpgrp

http://man7.org/linux/man-pages/man2/setpgid.2.html