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
또는공식 문서.
답변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 스크립트는 rc
with 및 동사라는 이름의 프로그램을 호출합니다. 따라서 언뜻 보면 시스템화된 서비스 단위도 동일한 작업을 수행해야 한다고 생각할 수 있습니다. 그러나 그것은 밝혀졌습니다arkmanager
start
stop
arkmanager
그 자체예끝나고 나면 더 있어요가난한 사람의 데몬 감독자는 쉘 스크립트로 작성되었습니다(항상 그렇듯이 나쁘게도). 이 스크립트는 동일한 쓰레기와 그 이상을 수행합니다. grep의 출력은 프로세스를 분기하는 방법으로 (sic!)을 ps
사용 하고 다음 으로 보냅니다. 이를 유지하고, 자체(회전되지 않은) 로그 파일을 유지하고, 데몬을 관리할 때 애초에 터미널에 연결하지 않는 프로그램에서 하드와이어된 CSI 시퀀스(sic!)를 사용합니다.screen
SIGINT
당신은 또 다른 공포를 만드는 데 바쁘다. 멈추다.
한 가난한 사람의 데몬이 다른 사람의 데몬을 감독하고 결국 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일 먼저 여기에 누군가가 이미 와 있습니다. 그들은 테러를 일으키지도 않았습니다.
추가 읽기
- 레나트 페틀링(2013-10-07).
systemctl
. 시스템 매뉴얼 페이지. freedesktop.org. - 조나단 데보인 폴라드(2015). 시스템화 된 공포의 집. 일반적인 답변(고정 URL)
- https://unix.stackexchange.com/a/207363/5132
- https://askubuntu.com/a/626858/43344
- "자동 시작".전용 서버 설정. 서바이벌 이볼브드 위키.