추가 읽기

추가 읽기

options 을 노출해야 하는 시스템 서비스를 작성하려고 합니다 start|stop|status|restart.

현재 스크립트는 다음과 같습니다.

[Unit]
Description=Daemon to start ark server
After=network.target

[Service]
ExecStart=/etc/init.d/arkdaemon start
ExecStop=/etc/init.d/arkdaemon stop
Type=forking

[Install]
WantedBy=multi-user.target

사용자 정의 상태 명령을 지정하는 방법을 찾을 수 없습니다.
방법이 있을 것 같은데 어떻게요?

답변1

Systemd는 사용자 정의 상태 메시지를 지원하지만 다음은 충족해야 할 몇 가지 전제 조건입니다.

  • 서비스 유형은 다음과 같아야 합니다.notify
  • /run/systemd/notify서비스는 소켓을 통해 또는 systemd-notify를 호출하여 현재 서비스 상태로 systemd를 업데이트해야 합니다.

참고로 Fedora에서 Apache HTTPD를 확인할 수 있습니다(다른 배포판에서도 동일할 수 있음).

systemctl status httpd.service


● httpd.service - The Apache HTTP Server    
  Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
  Active: active (running) since Fri 2017-10-06 15:21:07 CEST; 18h ago
  Docs: man:httpd.service(8)
  Process: 14424 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)  
  Main PID: 4105 (httpd)
  Status: "Total requests: 8; Idle/Busy workers 100/0;Requests/sec: 0.000118; Bytes served/sec:   0 B/sec"

Apache에 대한 상태 보고서는 다음과 같이 볼 수 있습니다.총 요청 수: 약속 있음/없음 작업자 100/0

따라서 pid 4105를 첨부하면 strace주기적으로 상태 업데이트를 다음으로 보내는 것을 볼 수 있습니다 systemd.

sudo strace -f -p 4105

wait4(-1, 0x7ffcfab4a25c, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {tv_sec=1, tv_usec=0}) = 0 (Timeout)
socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 8
getsockopt(8, SOL_SOCKET, SO_SNDBUF, [212992], [4]) = 0
setsockopt(8, SOL_SOCKET, SO_SNDBUFFORCE, [8388608], 4) = 0
sendmsg(8, {msg_name={sa_family=AF_UNIX, sun_path="/run/systemd/notify"}, msg_namelen=21, msg_iov=[{iov_base="READY=1\nSTATUS=Total requests: 8"..., iov_len=110}], msg_iovlen=1, msg_controllen=0, msg_flags=0}, MSG_NOSIGNAL) = 110
close(8)                                = 0
wait4(-1, 0x7ffcfab4a25c, WNOHANG|WSTOPPED, NULL) = 0

전송되는 것을 볼 수 있습니다.준비=1\nSTATUS=총 요청 수: 8...소켓에 연결/run/systemd/notify

추천도서

man systemd-notify

또는공식 문서.

예:Systemd에서 서비스 시작

답변2

options 을 노출해야 하는 시스템 서비스를 작성하려고 합니다 start|stop|status|restart.

당신의 첫 번째 실수. 서비스 단위는 스크립트가 아닙니다. 그들은하지 않습니다가지다옵션. 이러한 옵션은 systemctl명령별로 적용되며 모든 장치에 걸쳐 동일합니다.

Centos를 사용하는 것이 표준이 아닌 것 같다는 것을 깨달았습니다.

두 번째 오류는 세 번째 오류와 관련이 있습니다.

나는 데비안/우분투의 많은 문제를 해결하기 위해 PR을 병합할 것입니다. 그런 다음 Centos는 다른 초기화 방법을 사용하므로 대체 데몬을 작성해야 합니다.

CentOS는아니요반체제 인사를 제외하십시오. Ubuntu 버전 15, Debian 8 및 CentOS 7은 모두 systemd를 사용하며 모두 적절한 systemd 서비스 단위가 필요합니다.

ExecStart=/etc/init.d/arkdaemon 시작
ExecStop=/etc/init.d/arkdaemon 중지

네 번째 실수입니다. 모든 것을 System 5 rc스크립트 로 이동하여 서비스 단위를 작성하지 않을 것입니다 . 단, 데비안과 우분투에서는 모든 것을 걸기 때문에 작동하지 않습니다.뒤쪽에유닛을 서비스하는 것은 시스템화된 공포의 집에 들어갈 만한 끔찍한 개념입니다. System 5 스크립트를 보면 rc모든 잘못된 내용이 표시됩니다. — snappy grep 출력 , ps잘못된 사용sudo줄이다특권(대신얻다해당) - 적합한 서비스 관리자에게 문의하면 이 문제를 해결할 수 있습니다.

엉망으로 만들지 마십시오. 데몬이 실제로 어떻게 실행되는지 이해, 그리고 이를 설명하는 서비스 단위를 작성합니다.

System 5 스크립트는 rcwith 및 동사라는 이름의 프로그램을 호출합니다. 따라서 언뜻 보면 시스템화된 서비스 단위도 동일한 작업을 수행해야 한다고 생각할 수 있습니다. 그러나 그것은 밝혀졌습니다arkmanagerstartstoparkmanager 그 자체끝나고 나면 더 있어요가난한 사람의 데몬 감독자는 쉘 스크립트로 작성되었습니다(항상 그렇듯이 나쁘게도). 이 스크립트는 동일한 쓰레기와 그 이상을 수행합니다. grep의 출력은 프로세스를 분기하는 방법으로 (sic!)을 ps사용 하고 다음 으로 보냅니다. 이를 유지하고, 자체(회전되지 않은) 로그 파일을 유지하고, 데몬을 관리할 때 애초에 터미널에 연결하지 않는 프로그램에서 하드와이어된 CSI 시퀀스(sic!)를 사용합니다.screenSIGINT

당신은 또 다른 공포를 만드는 데 바쁘다. 멈추다.

한 가난한 사람의 데몬이 다른 사람의 데몬을 감독하고 결국 screen세 번째 임시 감독자의 신분을 남용하는 이 무너져가는 끔찍한 건물을 벗겨보면 기본 서비스 관리가 실제로 다음과 같다는 것을 알 수 있습니다.

[단위]
설명=아크서버
문서=https://unix.stackexchange.com/questions/212059/
이후 = network.target

[제공하다]
사용자=스팀
환경=세션=Linux 세션 이름
환경=QUERYPORT=27016
환경=PASS=비밀번호
환경=ADMINPASS=관리자 비밀번호
ExecStart=/home/steam/ARK/ShooterGame/Binaries/Linux/ShooterGameServer TheIsland?SessionName=${SESSION}?QueryPort=${QUERYPORT}?ServerPassword=${PASS}?ServerAdminPassword=${ADMINPASS}?listen
한도 NOFILE=100000
재시작=항상

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

systemd로 마이그레이션하는 첫 번째 규칙은 무엇입니까? 좋아요. 지금은 2015년인데 이미 누군가가 해냈을 가능성이 높습니다. 사실, 나보다 4일 먼저 여기에 누군가가 이미 와 있습니다. 그들은 테러를 일으키지도 않았습니다.

추가 읽기

관련 정보