2013-05-03 34 views
0

我正在尝试使用python编写一个下载程序脚本(放在统一启动程序中),它使用所有正确的参数调用wget。该脚本从剪贴板中提取url,并从gtk主剪贴板中提取文件名,通过文本选择或复制和鼠标中键单击粘贴。代码很简单。Python:阻止系统进程从后台进入

import gtk 
from os import system as sys 

url = str(gtk.clipboard_get().wait_for_text()) 
name = str(gtk.clipboard_get(gtk.gdk.SELECTION_PRIMARY).wait_for_text()) 

if name.lower()=='none' : 
    sys("/usr/bin/canberra-gtk-play --id='dialog-warning'") 
    exit(1) 

sys("/usr/bin/canberra-gtk-play --id='downloading'") 
com='wget -c -t 0 "%s" -O "%s"' % (url,name) 
sys("gnome-terminal -e '%s'" % com) 

该脚本打开一个终端窗口并点击wget输出。问题是关闭gnome-terminal并不会导致wget退出,而是在后台运行。是否有可能阻止这种情况发生

回答

0

问题是,by design,wget忽略在其父进程终止时发送的SIGHUP

一个解决方案是使用Python signal模块赶上,当你关闭终端窗口应该被发送到你的脚本SIGCHLD,并注册一个处理程序,明确地发出SIGINTSIGTERMwget

+0

我该怎么做。你可以用一个例子来展示,我将把它合并到代码中 – CuriousCat 2013-05-04 06:01:31

+0

@SaketDandawate如果你对信号不熟悉,用像[this]这样的脚本运行'wget'可能会更简单(https://gist.github .com/unakatsuo/1048855)用'hup2term wget ',它将父进程的SIGHUP转换为SIGTERM,或者用CTRL-C关闭窗口(发送'SIGINT'到'wget')关闭终端窗口。 – Aya 2013-05-04 15:42:13