标签: control-c

在Java中捕获Ctrl + C.

是否有可能在java命令行应用程序中捕获Ctrl+ C信号?我想在终止程序之前清理一些资源.

java command-line control-c

73
推荐指数
3
解决办法
6万
查看次数

使用^ C/KeyboardInterrupt在子线程中中断Python raw_input()

在多线程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(只是后台线程阻塞以便连接没有完成的事实).

python input sigint control-c python-multithreading

8
推荐指数
2
解决办法
2466
查看次数

如何在没有Ctrl-C的情况下终止hbase shell中的扫描操作

有时当我跑步时scan '<tablename>.我看到因为桌子很大而打印了大量数据.我想杀死打印数据的进程.除此之外还有办法Ctrl-C吗?因为Ctrl-C杀死shell进程而我不想退出shell.

shell hbase irb control-c

7
推荐指数
1
解决办法
3003
查看次数

将信号处理委托给python中的子进程

如何从python脚本运行命令并委托给它的信号如Ctrl+C

我的意思是当我跑步时:

from subprocess import call
call(["child_proc"])
Run Code Online (Sandbox Code Playgroud)

我想child_proc处理Ctrl+C

python subprocess signals control-c

5
推荐指数
1
解决办法
1292
查看次数

DTrace END探测器永远不会触发

我有一个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)

macos sudo dtrace control-c

5
推荐指数
1
解决办法
592
查看次数

如果VM被Control-C关闭,我可以确保我的定时器启动线程运行完成吗?

假设我对以下函数进行了几次调用:

 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时运行):

在Java中捕获Ctrl + C.

关闭挂钩将取消所有计时器.(假设我将计时器存储在类级别的集合中)

我可以保证在VM退出之前所有活动线程都将运行完成吗?

与此相关,只有在线程全部退出时才会调用shutdown钩子吗?

java command-line control-c java-6

1
推荐指数
1
解决办法
955
查看次数