A maneira elegante de ter o serviço do usuário systemd espera que o mysqld esteja disponível na inicialização

1

Eu tenho um servidor no qual estou executando um daemon como um usuário normal. Pretendo dar acesso a esse usuário no futuro para pessoas em quem confio ... mas, como precaução, gostaria que qualquer configuração e gerenciamento fosse feito sem acesso ao su ou sudo. Por esse motivo, escrevi uma unidade de usuário systemd simples e testei que ela funciona. Faz.

O problema é quando se reinicia o servidor. O systemd tenta iniciar o daemon antes que o mariadb (que este daemon precisa) esteja pronto. Isso faz com que o daemon falhe repetidamente até que exceda o StartLimit do systemd e o systemd pare de tentar iniciar o daemon todos juntos.

Existem várias abordagens que eu poderia adotar com isso. Eu poderia reescrever a unidade systemd para executar um script que consulta o sql server repetidamente até que ele obtenha uma conexão e só então tente iniciar o daemon. Ou eu poderia adicionar à unidade do sistema um tempo limite entre reinicializações de, digamos, 30 segundos? Mas ambos se sentem ... bagunçados ... pedestres. Eu prefiro uma solução mais elegante.

Eu tenho procurado as manpages do systemd mas ... há muito lá. Alguma idéia?

O arquivo de unidade em questão:

[Unit]
Description=Teamspeak 3

[Service]
Type=forking
#User=teamspeak
#Group=teamspeak
UMask=0027
Restart=always
WorkingDirectory=/home/teamspeak/ts
PIDFile=/home/teamspeak/ts/ts3server.pid
ExecStart=/home/teamspeak/ts/ts3server_startscript.sh start inifile=/home/teamspeak/ts/ts3server.ini
ExecStop=/home/teamspeak/ts/ts3server_startscript.sh stop
ExecReload=/home/teamspeak/ts/ts3server_startscript.sh restart

[Install]
WantedBy=default.target
    
por Cliff Armstrong 26.10.2018 / 02:49

2 respostas

3

Uma solução elegante é usar a ativação de soquete para iniciar o serviço do sistema, pois um dos pontos de ativação de soquete é permitir iniciar serviços que dependem um do outro sem precisar especificar suas dependências explicitamente (o que ser paralelizado ainda mais.)

Por exemplo, veja esta postagem do blog sobre a ativação do soquete , que torna esse ponto muito claro:

Socket activation makes it possible to start all four services completely simultaneously, without any kind of ordering. Since the creation of the listening sockets is moved outside of the daemons themselves we can start them all at the same time, and they are able to connect to each other's sockets right-away.

Embora seu caso específico seja o de uma dependência cruzada entre uma unidade de usuário e uma unidade de sistema, a mesma lógica se aplica.

Infelizmente, parece que o MariaDB atualmente não suporta a ativação do sistema nativamente . Mas você pode usar um proxy como systemd-socket-proxyd (8) para criar um serviço ativado por soquete proxies para o MariaDB em uma porta separada. Veja esta questão para mais detalhes.

Outra opção é executar o serviço Teamspeak como um serviço sistema em vez de um serviço de usuário e, em seguida, usar a diretiva User= (como a que você comentou no momento) para executá-lo com o seu usuário do serviço.

Como você até o descreve como um "daemon", eu diria que fazer um serviço de sistema é totalmente apropriado e talvez até a abordagem mais correta aqui.

Existem desvantagens, como dificultar o gerenciamento (interromper / reiniciar) o serviço de alguém conectado como usuário "teamspeak", mas sugiro que as providências que envolvem a mudança para uma conta de serviço tenham desvantagens (pessoalmente Eu evitaria esse tipo de configuração) e você ainda pode manter essa configuração e permitir que o usuário gerencie o serviço do sistema usando "sudo" ou similar.

    
por 26.10.2018 / 06:13
0
A diretiva

Requires=mysqld.service ou Wants=mysqld.service ajudará sua dependência de serviço.

systemd: Dependências de unidade e ordem na fedora Magazine para detalhes.

    
por 26.10.2018 / 04:28

Tags