是否有可能在java命令行应用程序中捕获Ctrl+ C信号?我想在终止程序之前清理一些资源.
在多线程Python程序中,一个线程有时会使用内置的raw_input()来请求控制台输入.我希望能够在raw_input提示符下通过在shell中键入^ C来关闭程序(即,使用SIGINT信号).但是,当子线程正在执行raw_input时,键入^ C什么也不做 - 在我点击返回(离开raw_input)之前不会引发KeyboardInterrupt.
例如,在以下程序中:
import threading
class T(threading.Thread):
def run(self):
x = raw_input()
print x
if __name__ == '__main__':
t = T()
t.start()
t.join()
Run Code Online (Sandbox Code Playgroud)
键入^ C在输入完成之前不会执行任何操作.但是,如果我们只是调用T().run()(即,单线程情况:只在主线程中运行raw_input),^ C立即关闭程序.
据推测,这是因为SIGINT被发送到主线程,它被挂起(等待GIL),而分支线程在控制台上阻塞读取.主线程在raw_input返回后抓取GIL之前不会执行其信号处理程序.(如果我错了,请纠正我 - 我不是Python线程实现方面的专家.)
有没有办法以类似raw_input的方式从stdin读取,同时允许主线程处理SIGINT,从而降低整个过程?
[我在Mac OS X和一些不同的Linux上观察到了上述行为.]
编辑:我错误地描述了上面的根本问题.在进一步调查中,主要线程的呼吁join()是阻止信号处理:Guido van Rossum本人已经解释说,加入中的底层锁定是不可中断的.这意味着信号实际上被推迟到整个线程完成 - 所以这实际上完全没有任何关系raw_input(只是后台线程阻塞以便连接没有完成的事实).
有时当我跑步时scan '<tablename>.我看到因为桌子很大而打印了大量数据.我想杀死打印数据的进程.除此之外还有办法Ctrl-C吗?因为Ctrl-C杀死shell进程而我不想退出shell.
如何从python脚本运行命令并委托给它的信号如Ctrl+C?
我的意思是当我跑步时:
from subprocess import call
call(["child_proc"])
Run Code Online (Sandbox Code Playgroud)
我想child_proc处理Ctrl+C
我有一个2009年中期的MacBook Pro和一个新的2012 MacBook Pro,我正在学习DTrace(一个非常神奇的工具).当我计算新的2012 MBP上的聚合时,聚合不会打印出来.
sudo dtrace -n 'syscall:::entry { @[execname] = count() }'
Run Code Online (Sandbox Code Playgroud)
在我2009年中期的MBP上,它显示了类似于:
usbmuxd 1
GrowlHelperApp 2
imklaunchagent 2
installd 2
stackshot 2
...
Run Code Online (Sandbox Code Playgroud)
2012 MBP没有显示任何内容.
我在BEING和END探针中添加了一个printf,看看END探针是否会像这样发射:
BEGIN
{
printf("Hi!");
}
syscall:::entry
{
@[execname] = count();
}
END
{
printf("Bye!")
}
Run Code Online (Sandbox Code Playgroud)
在2009年中期,MBP两种探测器都被发射和打印,而在2012 MBP上,只有BEGIN探测器被发射.END从未解雇过.
两个MBP都在运行Lion 10.7.3.我不确定下一步该尝试什么.现在想到的唯一区别是我没有在2012 MBP上安装开发人员命令行工具.这对我来说没有意义,而且是在黑暗中拍摄.
任何帮助或想法将不胜感激.谢谢.
============= [启用Root帐户] ====================
所以我启用了root帐户并重新运行了命令
sudo dtrace -n 'syscall:::entry { @[execname] = count() }'
Run Code Online (Sandbox Code Playgroud)
没有成功,但如果我这样做
su
dtrace -n 'syscall:::entry { @[execname] = count() }'
Run Code Online (Sandbox Code Playgroud)
有用!
============= [kill -s INT] =============================
我做了一些实验.如果我跑:
sudo …Run Code Online (Sandbox Code Playgroud) 假设我对以下函数进行了几次调用:
public void StartTimedRuns(){
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask(){
public void run(){
//do something that takes less than a minute
}
}, 0, 60*1000);
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,此时会有一堆线程同时运行.也就是说,每个计时器实例将以1分钟的间隔生成短期线程.
假设我按照以下说明安装了一个关闭钩子(按下Control-C时运行):
关闭挂钩将取消所有计时器.(假设我将计时器存储在类级别的集合中)
我可以保证在VM退出之前所有活动线程都将运行完成吗?
与此相关,只有在线程全部退出时才会调用shutdown钩子吗?