Daemon

帶有 daemontools 的 Node.js 伺服器不斷重啟

  • August 28, 2016

我想在 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,它會將信號發送到正確的實際服務程序。

進一步閱讀

引用自:https://unix.stackexchange.com/questions/233557