제가 서버관리를 잘 못해서 혹시 놓친 부분이 있다면 양해 부탁드립니다.
작동 중인 Node Express 서버가 있고 이를 배포 중이지만 forever
이제 이를 시스템 서비스로 이동하고 싶습니다. 서비스 파일을 만들었습니다./lib/systemd/system/myservice.service
[Unit]
Description=website service
After=network.target
[Service]
ExecStart=/home/myuser/.nvm/versions/node/v12.14.0/bin/node /home/myuser/WSProject/src/server/index.js
Type=simple
Restart=on-failure
[Install]
WantedBy=multi-user.target
이 구성을 얻기 위해 가이드를 따랐습니다. 노드 경로가 정확하고 를 사용할 때 반환되는 경로임을 확인했습니다 which node
. 데몬을 다시 시작한 다음 서비스를 다시 시작했습니다. 서비스가 실패했습니다. 서비스의 Journalctl을 확인하면 다음 오류가 표시됩니다.
Jul 30 12:55:03 psjqw2q9h systemd[1]: Started Run the encore server.
Jul 30 12:55:03 psjqw2q9h systemd[22298]: myservice.service: Failed to execute command: Exec format error
Jul 30 12:55:03 psjqw2q9h systemd[22298]: myservice.service: Failed at step EXEC spawning /home/myuser/WSProject/src/server/index.js: Exec format error
Jul 30 12:55:03 psjqw2q9h systemd[1]: myservice.service: Main process exited, code=exited, status=203/EXEC
Jul 30 12:55:03 psjqw2q9h systemd[1]: myservice.service: Failed with result 'exit-code'.
Jul 30 12:55:03 psjqw2q9h systemd[1]: myservice.service: Service hold-off time over, scheduling restart.
Jul 30 12:55:03 psjqw2q9h systemd[1]: myservice.service: Scheduled restart job, restart counter is at 1.
Jul 30 12:55:03 psjqw2q9h systemd[1]: Stopped Run the encore server.
이것이 내가 얻은 것입니다. 이 문제를 더 해결하는 방법을 모르겠습니다. 이와 비슷한 질문을 찾을 수 있지만 nodejs 관련 또는 구성 파일의 공백과 같은 작은 문제가 있습니다. 한 기사에서 언급했듯이 다양한 형태의 ExecStart 명령을 따옴표로 묶어서 사용해 보았습니다. 어느 시점에 사용자 라인이 있었지만 루트로 만들든 다른 것으로 만들든, 아니면 완전히 남겨두든 별 차이가 없었습니다.
답변1
해결 방법은 myservice.service 파일에 대한 권한을 조정한 다음 노드 애플리케이션을 실행해야 하는 위치에 WalkingDirectory 값을 추가하는 것입니다.