2012-07-20 69 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 /膩子問題。