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
올바른 실제 서비스 프로세스에 신호를 보냅니다.
추가 읽기
- 힘델(2013-07-24). Apache 및 daemontools를 사용하여 Node.js 배포. 세그멘테이션 오류.
- 스티브 캠프(2014-01-04).runit을 사용하여 서비스 유지. 데비안 관리.