Debian 9에서 Node.js 애플리케이션을 서비스로 실행하려고 합니다. 그래서 몇 가지 튜토리얼을 따라 비슷한 서비스를 만들었습니다.
[Unit]
Description=bumer API Http Server
[Service]
PIDFile=/tmp/bumer-service.pid
User=root
Group=root
Restart=always
KillSignal=SIGQUIT
WorkingDirectory=/root/bumer/
SyslogIdentifier=bumer
ExecStart=/root/bumer/app.js
[Install]
WantedBy=multi-user.target
내 응용 프로그램에는 #!/usr/bin/env node
첫 번째 줄이 있고 명령을 실행하면 정상적으로 실행됩니다 /root/bumer/app.js
. 문제는 서비스를 시작할 때 다음 오류가 발생한다는 것입니다.
main process exited, code=exited, status=127/n/a
그래서 app.js 파일의 첫 번째 줄을 "node"라는 단어 대신 노드 경로로 변경하려고 시도했는데 #!/usr/bin/env /usr/local/lib/nodejs/node-v8.11.4/bin/node
이제는 제대로 작동합니다. 서비스가 PATH 변수를 읽지 않는 것 같은데 왜 읽지 않는지 이해하는 데 도움이 필요합니다.
(내 경로가 정확하며 "type node"를 실행하면 결과가 좋습니다.)
root@bumer:~# type node
node is /usr/local/lib/nodejs/node-v8.11.4/bin/node
(app.js의 ~/.bashrc에 설정한 PORT 변수를 기록하고 있지만 읽을 수도 없고 기록합니다 undefined
.)
답변1
서비스는 로그인 세션 컨텍스트 내에서 실행되지 않습니다.
당신 PATH
은아니요PATH
예, 로그인 세션 내 셸의 값은 셸의 시작 스크립트와 마찬가지로 전혀 관련이 없습니다.
서비스 관리 시스템(일반적으로 systemd에 국한되지 않고)의 특징 중 하나는 모든 서비스를 수정하는 등 단일 통합 환경을 기반으로 시작한다는 것입니다.오직서비스에 의해 정의된 요소입니다(무엇이든). 이는 로그인 쉘이 로그인 세션에 대한 사용자 환경을 설정하는 방법과 관련이 없습니다. (아니요, root
로그인 세션 컨텍스트도 아닙니다 .)
systemd의 경우 서비스 정의는 서비스 단위 파일이며 PATH
해당 단위에서 수정하지 않는 한 기본값이 무엇이든 됩니다.모든 서비스는. systemd의 경우 이는 문서화되어 있습니다 /usr/local/lib/nodejs/node-v8.11.4/bin/
.아니요목록에.
모든 서비스에 대해 기본값이 아닌 다른 서비스를 사용 하려면 설정을 사용하여 서비스 단위를 수정하여 변경 PATH
해야 합니다 .Environment=
추가 읽기
- Lennart Petlinget al. (2017). "생성된 프로세스의 환경 변수". 시스템 실행 프로그램. 시스템 매뉴얼 페이지. freedesktop.org.