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
보내는 것을 볼 수 있습니다 . 이는 서비스가 종료되었다고 생각할 때 수행하는 작업입니다.SIGTERM
ExecStop
간단히 다음을 수행하십시오.
유형=단순 작업 디렉토리=/home/ubuntu/console/bin 사용자=우분투 ExecStart=/home/ubuntu/console/bin/consoleExecutable
아니요, ExecStop
실제로는 필요하지 않습니다.Environment
추가 읽기
- 조나단 데보인 폴라드(2015).실제로 데몬이 필요하지 않습니다. 진짜.. 체계화된 공포의 집.
- 조나단 데보인 폴라드(2016).두 개의 서비스가 있는 경우 두 서비스를 모두 정의하십시오.. 체계화된 공포의 집.
- 조나단 데보인 폴라드(2015).Unix 데몬의 준비 프로토콜 문제. 자주 주어지는 답변입니다.
- Systemd는 서비스를 시작한 후 즉시 서비스를 종료합니다.
답변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이 수행하는 모든 작업을 처리할 수 있습니다.