2012-07-20 71 views
1

我遇到了一个简单的nohup命令似乎表现异常的问题。我已经煮下来到一个名为睡眠Java小应用程序,做了nohup进程在xterm关闭时死亡,但不在出口

while (true) 
    Thread.sleep(10000). 

我作为运行的nohup如下:

nohup java Sleep.java >> nohup.log 2>&1 & 

我然后运行在另一个窗口strace的寻找信号如下寻找我的PID(12345)

strace -tt -p 12345 -enone -e 'signal=!sigchld' 
Process 16582 attached - interrupt to quit 

如果我原来的窗口,我键入“退出”,关闭壳我看到的过程中不断没有得到一个信号运行。但是如果我关闭腻子窗口(点击菜单栏上的X)我看到nohup'd过程确实得到SIGHUP

strace -tt -p 16582 -enone -e 'signal=!sigchld' 
Process 16582 attached - interrupt to quit 
14:54:03.271286 --- SIGINT (Interrupt) @ 0 (0) --- 

我以为nohup的应该拦截/不传下SIGHUP。我已经切换到使用setsid,无论我如何关闭终端窗口,我都会得到正确的行为。难道我做错了什么?似乎nohup不太正确地工作,这导致了我正在处理的实际问题中的一些严重问题。

+0

关闭腻子窗口似乎会触发一个SIGINT(而不是SIGHUP),而'nohup'不能/不捕捉。 – chepner 2012-07-20 19:18:45

+0

这里似乎有太多的细节。你说如果你ssh进入一个盒子,运行一个长时间运行的进程,例如'nohup sleep 10000&',然后通过关闭客户端来终止你的ssh连接,那么“sleep”进程将被终止?这听起来确实不对。我刚刚测试过,它在我的盒子上工作正常。 (也许chepner是对的,腻子产生了一个不好的信号,在这种情况下,这听起来像是腻子中的一个错误)。 – 2012-07-20 19:19:25

回答

0

与此在Java中处理......请注意,虽然线程表明,这会在任何操作系统上工作,我怀疑Windows有信号: Ignore SIGINT in Java

你也可以写你自己的nohup相当于该忽略SIGHUP和SIGINT。或者你可以下载GNU nohup源代码并修改它以忽略SIGINT。

有一次,这可能不是Windows /腻子问题。