추가 읽기

추가 읽기

systemd(실행 파일)를 사용하여 데몬으로 실행하는 C++ 기반 응용 프로그램이 있습니다.

유닛 파일:

[단위]
설명 = 콘솔 서비스
이후 = network.target

[제공하다]
환경="사용자=우분투" "경로=/home/ubuntu/console/bin"
작업 디렉토리=/home/ubuntu/console/bin
ExecStart=/bin/sh -ec "exec /sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo --exec 콘솔 실행 파일 "#2>/dev/null
ExecStop=/bin/sh -ec "exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --retry =TERM/30/KILL/5 --oknodo --exec consoleExecutable" #2>/dev/null
다시 시작 = 실패 시
퇴실 후 남은 잔량 = 아니요
시간 초과 중지 초=10
성공적인 종료 상태=0 1
시간 초과 시작 시간(초) = 360

[설치하다]
WantedBy=다중 사용자.대상

시작 명령을 실행하면 서비스가 시작되지만 즉시 종료 신호를 받고 종료됩니다. 무슨 일이 일어나고 있는지에 대한 단서가 있나요?

sudo systemctl 상태 console.service
● console.service - 콘솔 서비스
   로드됨: 로드됨(/etc/systemd/system/console.service; 활성화됨, 공급업체 기본값: 활성화됨)
   활성: 1초 전 월요일 19:58:58 UTC 이후 비활성화되었습니다(stop-sigterm).
  프로세스: 8706 ExecStop=/bin/sh -ec exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console.pid - -retry=TERM/30/KILL/5 --oknodo --exec consoleExecutable #2>/dev/null (코드=종료, 상태=0/성공)
  프로세스: 8701 ExecStart=/bin/sh -ec exec /sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo - -exec consoleExecutable #2>/dev/null (코드=종료, 상태=0/성공)
 마스터 PID: 8701(코드=종료, 상태=0/성공)
    작업: 1
   메모리: 1.8M
      CPU: 53ms
   C그룹:/system.slice/console.service
           └─8705 콘솔 실행 파일

9월 25일 19:58:58 mgmt1 systemd[1]: 콘솔 서비스를 시작합니다.

sudo systemctl 상태 console.service
● console.service - 콘솔 서비스
   로드됨: 로드됨(/etc/systemd/system/console.service; 활성화됨, 공급업체 기본값: 활성화됨)
   활성: 947밀리초 전 월요일 19:59:01 UTC 이후 비활성(비활성)
  프로세스: 8706 ExecStop=/bin/sh -ec exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console.pid - -retry=TERM/30/KILL/5 --oknodo --exec consoleExecutable #2>/dev/null (코드=종료, 상태=0/성공)
  프로세스: 8701 ExecStart=/bin/sh -ec exec /sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo - -exec consoleExecutable #2>/dev/null (코드=종료, 상태=0/성공)
 마스터 PID: 8701(코드=종료, 상태=0/성공)

9월 25일 19:58:58 mgmt1 systemd[1]: 콘솔 서비스를 시작합니다.

답변1

환경="사용자=우분투" "경로=/home/ubuntu/console/bin"
작업 디렉토리=/home/ubuntu/console/bin
ExecStart=/bin/sh -ec "exec /sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo --exec 콘솔 실행 파일 "#2>/dev/null
ExecStop=/bin/sh -ec "exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --retry =TERM/30/KILL/5 --oknodo --exec consoleExecutable" #2>/dev/null

이것은 systemd의 공포의 집과 거의 비슷합니다. 그렇게 할 수 있는 공포 이야기가 아직 없었다면 좋았을 텐데요.

start-stop-daemon서비스 단위에서 모든 작업을 수행하는 데 사용 하지 마세요 .서비스 부서에서는 이미 이 작업을 수행했습니다.ExecStart.불필요한 PID 파일이 있을 뿐만 아니라 쉘 구문 주석이 허용된다고 잘못 가정합니다.

그리고 다른 답변에서 말하는 대로 하지 말고 피하려고 노력하세요 Type=forking. 이는 상황을 개선하기는커녕 더욱 악화시킬 것입니다.

헛소리는 start-stop-daemon일이 잘못되는 이유입니다. 프로세스가 실행 되고 있지 start-stop-daemon않기 때문에~이 되다서비스가 종료되지만 실제로는 거의 즉시 종료되므로 systemd는 서비스가 종료되는 것으로 생각합니다. 첫 번째 출력에서 ​​systemd는 정리 작업 이후에 실행 중인 나머지 모든 프로세스에 대해 메시지를 systemctl status보내는 것을 볼 수 있습니다 . 이는 서비스가 종료되었다고 생각할 때 수행하는 작업입니다.SIGTERMExecStop

간단히 다음을 수행하십시오.

유형=단순
작업 디렉토리=/home/ubuntu/console/bin
사용자=우분투
ExecStart=/home/ubuntu/console/bin/consoleExecutable

아니요, ExecStop실제로는 필요하지 않습니다.Environment

추가 읽기

답변2

systemd는 데몬의 pid가 8701이라고 생각합니다. 즉, start-stop-daemon데몬의 pid는 8705입니다. 유닛 파일 Type=forking(아래)에서 이를 설정해야 합니다. [Service]기본적으로 Type=simple프로세스는 분기되지 않는 것으로 가정됩니다.

그런데 왜 이 /bin/sh -ec exec /sbin/start-stop-daemon괴물을 사용하는 걸까요? systemd는 start-stop-daemon이 수행하는 모든 작업을 처리할 수 있습니다.

관련 정보