2017-01-09 53 views
1

我有一個運行在Node服務器上的JS模塊,它產生一個進程來處理我們將信息存儲在我們想發送給另一個服務的文件中的情況,但該服務當前已關閉,並且我想偶爾ping它看它是否備份。如何獲得對模塊中以前分叉過程的引用?

該模塊被其他開發人員用來捕獲要發送到日誌記錄服務的信息,並且他們可能會從他們自己的應用程序多次調用該模塊。所以,模塊需要了解這個過程是否已經產生。

我遇到的問題是,當這個過程已經產生,我不知道如何得到它的參考。

Parent.js(未粘貼整個事情簡潔)

var cp = require('child_process'); 
var dbWatcher; 
if (!processDoesExist) { 
     dbWatcher = cp.fork(__dirname + '/dbWatcher.js', [], {execArgv: ['--debug=5859']}); 
} else { 
     dbWatcher.send(message); 
} 

當這個模塊被加載和確實存在的過程中,dbWatcher將明顯不確定,導致錯誤。我如何獲得對現有過程對象的引用,例如我在做cp.fork()時分配的對象?

我試着通過節點的documentation看這個和通常的Google-fu,但我沒有提出解決方案。

更新:可以通過在第一次運行期間將返回的對象分配給全局對象來解決此問題。但是,它確實看起來像Node應該提供一個更乾淨的方式出於某種原因。

回答

1

我相當肯定保留對進程的引用的唯一方法是,如果它是從你自己的應用程序中產生的(或者至少在同一個OS實例中,你必須做一些嚴重的時髦進程附加 - 我不知道這是可能的,但即使是這樣:ew!)。最好你可以在這裏做的是使用child.pid引用子進程ID和存儲在某個地方。

你應該考慮的另一個問題是如果你的應用在多個位置運行,你會怎麼做?您需要一個能夠告訴任何正在運行的應用程序是否已經運行或者是否需要執行的真相源。

我想給一些認真的想法重新構建這個過程作爲一個獨立的微服務在一個地方運行一次。構建一些響應其狀態的簡單API,並允許您在需要時初始化或重新啓動該過程。這樣做的好處是,您現在可以將其作爲模塊推送給所有開發人員,並保證它將成爲單一事實。

+0

感謝您的快速響應!看起來,如果Node允許應用程序產生一個孩子並在父母被殺時讓其繼續運行,那麼如果我保留了進程ID,它應該有辦法在以後獲得同一個引用對象。不幸的是,如果事實並非如此!關於重建爲微處理的有趣點。運行的特定環境是我們期望多個節點服務器在給定的物理服務器上運行的環境,並且每個實例都有一個派生的觀察器進程。 – Mike

+0

如果您可以存儲子進程的pid,我想只需枚舉系統進程並檢查該pid是否可行,然後將其存儲在其他開發人員可以找到該pid的地方?儘管如此,你將無法重新貼上它。與此相關的風險是,儘管這是一個很小的統計概率,但可能會有一些其他系統進程在其子進程死後執行時使用相同的子進程。這一切似乎都非常黑客,並且在未來可能會給你帶來很大的痛苦,因爲時間花在了短時間內。 – brandonscript

+0

是的,我發佈了一個解決方案的更新問題。就像你在這個最新的評論中提到的那樣,基本上都覺得哈克。如果Node有一個可靠的,經過測試的檢索該對象的方法,我會覺得更舒服。 – Mike

相關問題