종료 상태 127을 수정하는 방법은 무엇입니까?

종료 상태 127을 수정하는 방법은 무엇입니까?

따라해보려고 했는데이 가이드노드 애플리케이션을 서비스로 실행합니다. 그러나 종료 코드 127로 시작하지 못합니다. 이 문제를 해결할 방법이 있나요?

이것은 일기입니다.

sudo  journalctl --follow -u serviceName
-- Logs begin at Tue 2017-08-08 16:27:10 GMT. --
Aug 08 17:06:57 raspberrypi systemd[1]: Started serviceName.
Aug 08 17:06:57 raspberrypi app.js[7234]: [46B blob data]
Aug 08 17:06:57 raspberrypi systemd[1]: serviceName.service: main process exited, code=exited, status=127/n/a
Aug 08 17:06:57 raspberrypi systemd[1]: Unit serviceName.service entered failed state.
Aug 08 17:06:57 raspberrypi systemd[1]: serviceName.service holdoff time over, scheduling restart.
Aug 08 17:06:57 raspberrypi systemd[1]: Stopping serviceName...
Aug 08 17:06:57 raspberrypi systemd[1]: Starting serviceName...
Aug 08 17:06:57 raspberrypi systemd[1]: serviceName.service start request repeated too quickly, refusing to start.
Aug 08 17:06:57 raspberrypi systemd[1]: Failed to start serviceName.
Aug 08 17:06:57 raspberrypi systemd[1]: Unit serviceName.service entered failed state.

serviceName.service입니다.

[Unit]
Description=ServiceName
After=network.target

[Service]
ExecStart=/home/pi/projects/ServiceName/app.js
Restart=always
User=root
Group=root
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/home/pi/projects/ServiceName

[Install]
WantedBy=multi-user.target

이것은 내 app.js의 상단입니다.

#!/usr/bin/env node

답변1

ExecStart=/home/pi/projects/ServiceName/app.js

systemd직접 실행하라고 합니다 app.js. 이 파일을 직접 실행할 .js수 있나요 ? 그렇지 않은 경우 쉘은 종료 코드 127 - "알 수 없는 명령"을 발생시킵니다.

답변2

127은 명령을 찾을 수 없습니다.

루트 사용자가 노드 바이너리에 액세스할 수 있는지 확인하세요. 그렇지 않으면 다음 줄을 노드를 설치한 사용자로 변경하세요.

User=root
Group=root

그렇지 않으면 다음을 시도하십시오

[Unit]
Description="ServiceName"
After=network.target

[Service]
ExecStart=path_to_node/node /home/pi/projects/ServiceName/app.js
Restart=always
# Restart service after 10 seconds if node service crashes
RestartSec=10

# Output to syslog
StandardOutput=syslog
StandardError=syslog
#Change this to find app logs in /var/log/syslog
SyslogIdentifier=nodejs-api
# Followig will require if you are using the PORT or Node from Envirnoment
Environment=NODE_ENV=production PORT=3000

[Install]
WantedBy=multi-user.target

서버 시스템이 가동되고 서버에 액세스할 수 없으면 다음 명령을 사용하여 /var/log/syslog의 로그를 확인하여 문제를 해결할 수 있습니다.

sudo grep "nodejs-api" /var/log/syslog

신병:sudo systemctl 로켓 활성화

답변3

디버깅하려면 다음 명령을 실행하세요(<> 부분을 시스템 장치 파일의 값으로 바꾸세요).

sudo runuser -l <User> -g <Group> -c "cd <WorkingDirectory> && <PATH> <ExecStart>"

문제는 User설정한 내용에 액세스할 수 없다는 것입니다 ExecStart.PATH

여전히 문제가 있는 경우 단계별 가이드를 작성했습니다.디버깅 시스템

답변4

안녕하세요, 관심 있는 분들을 위해 말씀드리자면, 저는 이 문제에 부딪혀 모든 것을 시도했지만 결국 Node 6에서 Node 12로 업그레이드하여 문제가 해결되었습니다.

관련 정보