2014-09-25 60 views
7

我在使用REDIS數據存儲的應用程序上工作。爲了保持數據的完整性,我想清理過程關閉時的商店。我創建了一個函數處理函數並將其與process.on()綁定在一起來表示事件:uncaughtException,SIGINT,SIGTERM,SIGQUIT並且它工作正常(CTRL + C,進程查殺,異常,...)。當Node.js進程可以直接退出()而不觸發其他信號事件(uncaughtException,SIGINT,SIGTERM ...)

但我讀過,在某些情況下,過程可以直接退出而不觸發其他信號事件。

在該特定情況下的問題是,process.on(「退出」)處理程序只能處理同步任務。

我做了不同的測試,嘗試以不同的方式殺死進程。 (除了在Windows上使用SIGTERM)我無法確定process.on('exit')是否在沒有SIGINT,SIGTERM或其他事件觸發的情況下直接觸發的情況。

所以我的問題是(在Linux系統上),在什麼情況下進程可以直接退出而不會觸發此事件:http://nodejs.org/api/all.html#all_signal_events

+0

好的第一個問題,歡迎來到SO:),還有,你在哪裏閱讀過其他條件?這可能是一個很好的研究起點。 – DrakaSAN 2014-09-25 09:15:58

+0

對此有何評論至少筆者說:https://github.com/Automattic/socket.io-redis/pull/15 _「我沒能正常後做正確的退出清理,所以**退出**,房間仍然充滿了相同的(現在unexisting)插槽標識。用Ctrl + C或按預期的方式終止信號應該工作退出。「_ 所以也許我可以直接問他什麼是」正常退出「的意思。 – damien 2014-09-25 11:33:23

+0

這將是一個不錯的主意,我不看不到他怎麼可以「正常退出」沒有在這個過程中的事件之一...... – DrakaSAN 2014-09-25 12:37:01

回答

7

截至目前,讀documentation,做一些research,似乎只有四向使Node.js應用程序退出:

它通常會發生某人不明白來自uncaughtException的錯誤消息,並錯誤地認爲它是「別的東西」,導致node.js.

+1

這不完全正確。當一個過程實際上是由信號直接終止(如SIGABRT,作爲一個常見的例子),也沒有機會來處理該信號。程序可以選擇處理信號然後退出,但是從操作系統的角度來看(正如wait(2)系列報告的那樣),信號並沒有終止進程 - 它只是正常退出。 – 2016-03-14 21:27:59

+0

@DavePacheco:但事件'process.on('SIGABRT')'仍然會首先執行,即使操作系統認爲程序正常退出。 – DrakaSAN 2016-03-14 21:54:06

0

確實。我只是想指出Node程序可以在沒有執行處理程序(如果沒有註冊)的情況下由於信號而退出。重讀你的文章,我發現你的意思可能也是這樣。

相關問題