Daemon
帶有 daemontools 的 Node.js 伺服器不斷重啟
我想在 Debian (Jessie) 上執行帶有 daemontools 的 Node.js 伺服器,但我執行的腳本
supervise
會不斷重啟。這是我正在使用的執行腳本(/etc/service/node/run
):#!/bin/bash exec setuidgid nodeuser bash -c './node'
該腳本以 user 身份執行以下腳本
nodeuser
,我在其中載入 NVM,切換到我的程式碼目錄,然後執行 Node.js 伺服器:#!/bin/bash # Load NVM because we are in a non-interactive shell export NVM_DIR="/home/nodeuser/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # Run server cd /path/to/code exec node server.js
當我使用 啟動服務時
sudo svc -u /etc/service/node
,該程序一直重新啟動並ps faux
顯示以下程序層次結構(層次結構的深度始終在變化):/bin/sh /usr/bin/svscanboot /etc/service/ \_ svscan /etc/service \_ supervise node \_ /bin/bash ./node \_ /bin/bash ./node \_ /bin/bash ./node \_ /bin/bash ./node \_ /bin/bash ./node | \_ /bin/bash ./node | \_ /bin/bash ./node | | \_ /bin/bash ./node | | \_ /bin/bash ./node | \_ /bin/bash ./node | \_ tail -n1 \_ /bin/bash ./node \_ tail -n1
你知道那裡發生了什麼嗎?當我使用 手動執行腳本時
./run
,伺服器會按預期啟動並在控制台中顯示其輸出。編輯
我發現該服務只有在重新啟動後才能工作。一旦我用 重新啟動它
sudo svc -du /etc/service/node
,它的行為就像上面描述的那樣。
那個劇本是錯的。daemontools 系列的格言是執行的程序
./run
必須是服務程序本身,而不是其父、祖父或其他親屬。服務是執行的,而不是產生的。在最後一行使用
exec
是正確的想法,但被以下使用顯式破壞了bash -c
。無論如何,這是不必要的,因為./node
腳本具有#!/bin/bash
指定的腳本解釋器並且(可能)是可執行的。更好的#!/bin/bash 執行 setuidgid 節點使用者 ./node
這當然可以是
nosh
(來自同名的工具集)或execlineb
腳本,因為重量級的 Bourne Again shell 並不真正需要僅僅執行一個setuidgid
命令。因此:#!/bin/nosh setuidgid 節點使用者 。/節點
或者
#!/command/execlineb -P s6-set 引導節點使用者 。/節點
然後,當服務管理器響應 來關閉服務時
svc -d
,它會將信號發送到正確的實際服務程序。進一步閱讀
- 海姆德爾 (2013-07-24)。 使用apache 和 daemontools 部署 node.js。分段故障。
- 史蒂夫坎普 (2014-01-04)。使用 runit 維護服務。Debian 管理。