daemontools가 있는 Node.js 서버가 계속 다시 시작됩니다.

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서버가 예상대로 시작되고 콘솔에 출력이 표시됩니다.

편집하다

서비스를 다시 시작한 후에만 작동하는 것으로 나타났습니다. .it 로 다시 시작하면 sudo svc -du /etc/service/node위에서 설명한 대로 작동합니다.

답변1

해당 스크립트가 잘못되었습니다. daemontools 시리즈의 모토는 실행되는 프로그램이 ./run서비스 프로세스여야 한다는 것입니다.그 자체, 부모, 조부모 또는 기타 친척이 아닌. 서비스는 생성되지 않고 실행됩니다.

마지막 줄의 사용은 exec올바른 생각이지만 다음의 명시적인 사용으로 인해 깨졌습니다 bash -c. 어쨌든 ./node스크립트에는 #!/bin/bash스크립트 인터프리터가 지정되어 있고 (아마도) 실행 가능하므로 이는 필요하지 않습니다 . 더 나은 것

#!/bin/bash
setuidgid node user ./node 실행

이것은 확실히nosh(에서같은 이름의 도구 세트) 또는execlineb명령 을 실행하는 데 중량급 Bourne Again 셸이 실제로 필요하지 않기 때문에 스크립트입니다 setuidgid. 그러므로:

#!/빈/노쉬
setuidgid 노드 사용자
. /마디
또는

#!/명령/execlineb -P
s6-setuidgid 노드 사용자
. /마디

그런 다음 서비스 관리자가 서비스 종료에 응답하면 svc -d올바른 실제 서비스 프로세스에 신호를 보냅니다.

추가 읽기

관련 정보