CentOS 7에서 왜 systemctl 서비스가 시작되지 않았는지 어떻게 알 수 있습니까?


12

CentOS 7을 사용하고 있습니다. 왜 서비스가 시작되지 않는지 어떻게 알 수 있습니까? 이 서비스를 만들었습니다

[rails@server ~]$ sudo cat /usr/lib/systemd/system/nodejs.service
[Unit]
Description=nodejs server

[Service]
User=rails
Group=rails
ExecStart=/home/rails/NodeJSserver/start.sh
ExecStop=/home/rails/NodeJSserver/stop.sh

[Install]
WantedBy=multi-user.target

파일이 이것을 가리킴

[rails@server ~]$ cat /home/rails/NodeJSserver/start.sh
#!/bin/bash

forever start /home/rails/NodeJSserver/server.js

이 파일을 단독으로 실행할 수 있습니다. 그러나 서비스의 일부로 사용하려고 시도하면 nodeJS 서버가 시작되지 않은 것을 알 수 있습니다. "sudo systemctl --state = failed"를 확인하더라도 오류가 표시되지 않습니다 ...

[rails@server ~]$ sudo systemctl enable NodeJSserver
[rails@server ~]$ sudo systemctl start NodeJSserver
[rails@server ~]$
[rails@server ~]$
[rails@server ~]$ forever list
info:    No forever processes running
[rails@server ~]$
[rails@server ~]$
[rails@server ~]$ sudo systemctl --state=failed
  UNIT                           LOAD   ACTIVE SUB    DESCRIPTION
● nginx.service                  loaded failed failed The nginx HTTP and reverse proxy server
● systemd-sysctl.service         loaded failed failed Apply Kernel Variables
● systemd-vconsole-setup.service loaded failed failed Setup Virtual Console

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

3 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

서비스가 시작되지 않은 이유를 어떻게 알 수 있습니까?


journalctl -u nodejs더 의미있는 오류 메시지를 제공해야합니다.
Federico klez Culloca

"저널 파일을 찾을 수 없습니다"라는 메시지가 나타납니다.
Dave

sudo journalctl이 작동해야합니다. 또한 start.sh 내에서 출력 로그 파일을 다른 곳으로 리디렉션하는지 확인하십시오.
rogerdpack

답변:


13

귀하의 서비스는 섹션에 Type=명시되어 있지 [Service]않으므로 systemd귀하는를 의미한다고 가정합니다 Type=simple.

즉 , 서비스가 실행되는 동안 systemd시작된 프로세스가 ExecStart=계속 실행됩니다. 그러나 start.sh하나의 명령 만 실행 한 다음 종료되는 것처럼 보입니다 . 즉 , forever명령입니다 . forever start대상 명령을 데몬으로, 다시 말해 백그라운드에서 시작합니다. forever start명령이 완료 되 자마자 실행중인 쉘 start.sh이 종료됩니다.

이때이 systemd서비스는 실패한 것으로 간주합니다. 그러나 해당 서비스에 할당 된 제어 그룹에는 여전히 실행중인 프로세스가 있습니다. "그래서 systemd실패했을뿐 아니라 그 자체로도 혼란스러워했다"고 생각했다. 지정 되지 KillMode=않았 으므로 기본값으로 진행하여 해당 제어 그룹의 나머지 프로세스에 대해 SIGTERM을 전송하며, 적시에 중지되지 않으면 SIGKILL을 따릅니다. 그 후에는 실제 NodeJS 프로세스가 종료되고 보장됩니다.KillSignal=systemd

고치는 방법

ExecStart=실제 서버가 시작 되 자마자 실행하는 명령 이 종료되므로 default를 사용할 수 없습니다 Type=simple. 다른 서비스 유형을 지정해야합니다.

을 사용할 수 있습니다 Type=forking. 이 유형의 경우 옵션 man systemd.service사용을 권장 PIDFile=하므로 NodeJS 서버가 자체 PID 파일을 작성하는 경우 (또는 forever명령에 옵션을 추가 하여 작성하는 경우) systemd위치 를 알려야 합니다.

[Service]
Type=forking
PIDFile=/absolute/path/to/nodejs.pid
User=rails
... <the rest as before>

경우 Type=forking당신을 위해 작동하지 않습니다, 당신은 지정할 수 있습니다 Type=oneshotRemainAfterExit=yes.

따라서 서비스를 시작할 때 와 중지 할 때 명령을 systemd실행하고 다른 것은 신경 쓰지 않습니다.ExecStart=ExecStop=

systemd그래도 서비스가 마지막으로 중지 또는 시작 상태로 설정되었는지 기억합니다. 따라서이 서비스에 의존하도록 다른 서비스를 설정 한 다음 NodeJS 서비스를 수동으로 중지하면 다른 서비스는 자동으로 중지되지 않으며 NodeJS 서비스를 사용할 수 없을 때 오류를 리턴합니다.


세 번째 옵션은 forever명령을 완전히 건너 뛰고 systemdNodeJS 프로세스를 다시 시작하는 작업을 수행하는 것입니다. 이 경우 전체 nodejs.service단위는 다음과 같습니다.

[Unit]
Description=nodejs server

[Service]
User=rails
Group=rails
ExecStart=/home/rails/NodeJSserver/server.js
Restart=always

[Install]
WantedBy=multi-user.target

다른 옵션을 추가 할 수 있습니다.

예를 들어, RestartSec=5서비스가 예기치 않게 종료되는 경우 서비스를 다시 시작하기 전에 5 초의 절전 모드를 지정하여 어떤 이유로 든 서비스를 다시 시작한 직후에 서비스가 계속 중단되는 경우 빈번한 다시 시작 시도로 시스템 리소스가 낭비되는 것을 방지 할 수 있습니다. (기본값 RestartSec=은 100ms입니다.)

또는 특정 종료 상태 값을 반환하지만 다른 서비스에서는 실패한 것으로 간주되면 서비스를 다시 시작하려는 경우 해당 옵션도 있습니다.


나는 멈추지 않았고 제대로 시작하지 않는 서비스를 가지고있었습니다 (시작하지만 systemctl 프로세스는 종료되지 않습니다). 내 경우에는 그것을 추가 Restart=always하고 싶습니다. 내가해야 할 일은 내 .service 구성 파일 에 추가 하는 것입니다.
Andy Forceno
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.