systemd mensagem de status personalizada?

4

Estou tentando escrever um serviço systemd que exponha as opções start|stop|status|restart .

Este é o script atual:

[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

Não consigo encontrar uma maneira de especificar um comando de status personalizado.
Existe uma maneira que eu penso, mas como?

    
por Fez Vrasta 25.06.2015 / 10:55

2 respostas

7

I'm trying to write a systemd service which should expose the options start|stop|status|restart.

Seu primeiro erro. Unidades de serviço não são scripts. Eles não têm opções . As opções são para o comando systemctl e são uniformes em todas as unidades.

I realize using centos seems to be non-standard,

Seu segundo erro, relacionado ao seu terceiro erro:

I'm going to merge a PR to fix the lot of stuff in debian/ubuntu. then we'll have to write an alternative daemon for centos, because it uses a different init method.

O CentOS não é o estranho. A versão 15 do Ubuntu, o Debian 8 e o CentOS 7 usam systemd e todos precisam de uma unidade de serviço apropriada.

ExecStart=/etc/init.d/arkdaemon start
ExecStop=/etc/init.d/arkdaemon stop

Seu quarto erro. Você não escreve unidades de serviço punindo tudo para um script System 5 rc . Além do fato de que isso não funcionará no Debian e no Ubuntu, porque eles tentam colocar tudo de volta na unidade de serviço; é um horror de um conceito, digno de uma entrada na casa do horror do sistema. Observando o script System 5 rc , ele retorna todos os disparates equivocados - usando a saída de ps , uso equivocado de privilégios sudo a drop (em vez de adquiri-los) - que mudar para um gerente de serviço adequado se livrar.

Não confunda aleatoriamente. Compreenda como o seu daemon é realmente executado e, em seguida, escreva uma unidade de serviço que descreva isso.

O script do sistema 5 rc chama um programa chamado arkmanager com start e stop verbos. Assim, à primeira vista, pode-se pensar que uma unidade de serviço systemd também deveria. Mas acontece que arkmanager si é mais outro Supervisor do Daemon do Pobre homem escrito (mal, como sempre são) em shell script, que faz o mesmo absurdo e muito mais - mostrando a saída de ps , usando screen (sic!) como uma maneira de separar um processo e depois enviar um SIGINT para ele, mantendo seu próprio arquivo de log (não rotacionado) e usando seqüências CSI conectadas (sic!) em um programa que ao gerenciar um daemon não está sendo executado conectado a um terminal em primeiro lugar.

Você está ocupado construindo outro horror. Pare.

Retirando o horrendo edifício cambaleante que tem um Supervisor do Daemon de Poorman supervisionando outro, que por sua vez está abusando de screen como terceiro supervisor ad hoc, descobre-se que o gerenciamento de serviços subjacente se parece com isto:

[Unit]
Description=ARK server
Documentation=https://unix.stackexchange.com/questions/212059/
After=network.target

[Service]
User=steam
Environment=SESSION=YourLinuxSessionName
Environment=QUERYPORT=27016
Environment=PASS=password
Environment=ADMINPASS=adminpassword
ExecStart=/home/steam/ARK/ShooterGame/Binaries/Linux/ShooterGameServer TheIsland?SessionName=${SESSION}?QueryPort=${QUERYPORT}?ServerPassword=${PASS}?ServerAdminPassword=${ADMINPASS}?listen
LimitNOFILE=100000
Restart=always

[Install]
WantedBy=multi-user.target

E qual é a primeira regra de migração para o systemd? Está certo. Agora é 2015, e alguém provavelmente já fez isso. E de fato aqui, alguém já tem, me batendo por 4 dias. Eles também não construíram um horror.

Leitura adicional

por 25.06.2015 / 14:32
2

Systemd suporta a mensagem de status personalizado, mas aqui estão alguns pré-requisitos que devem ser atendidos:

  • o tipo de serviço deve ser notify
  • seu serviço deve atualizar o systemd com seu status de serviço atual via /run/systemd/notify socket ou chamando systemd-notify

Como referência, você pode verificar o Apache HTTPD no Fedora (talvez o mesmo em outras distribuições, não sei):

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"

Você pode ver que o Apache está relatando status como Total de solicitações: 8; Trabalhadores ociosos / ocupados 100/0

Então, quando eu anexei strace no pid 4105, podemos ver que ele está periodicamente enviando atualizações de status para 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

Você pode ver que está enviando READY = 1 \ nSTATUS = Total de solicitações: 8 ... no soquete /run/systemd/notify

Leitura recomendada

man systemd-notify

ou documentação oficial .

Exemplo: Inicialização do serviço no Systemd

    
por 07.10.2017 / 10:19

Tags