Após navegar pelas manpages mais algumas vezes (sim, a resposta nunca está lá pela primeira vez ...), eu encontrei uma solução ... que não funcionou. Depois de navegar ainda mais, finalmente encontrei a solução mais elegante possível.
[Unit]
Description=Minecraft server
After=local-fs.target network.target
[Service]
WorkingDirectory=/home/minecraft/minecraft_server
User=minecraft
Group=minecraft
Type=forking
# Run it as a non-root user in a specific directory
ExecStart=/usr/bin/screen -h 1024 -dmS minecraft ./minecraft_server.sh
# I like to keep my commandline to launch it in a separate file
# because sometimes I want to change it or launch it manually
# If it's in the WorkingDirectory, then we can use a relative path
# Send "stop" to the Minecraft server console
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff \"stop\"5'
# Wait for the PID to die - otherwise it's killed after this command finishes!
ExecStop=/bin/bash -c "while ps -p $MAINPID > /dev/null; do /bin/sleep 1; done"
# Note that absolute paths for all executables are required!
[Install]
WantedBy=multi-user.target
Isso realmente parece melhor do que o meu roteiro original! No entanto, existem algumas regressões.
- Se eu quiser passar comandos para o console do servidor, terei que criar um script separado para fazer isso.
- Depois de executar
systemctl start minecraft
ousystemctl stop minecraft
, verifiquesystemctl status minecraft
, porque esses comandos não fornecem nenhuma saída, mesmo que eles realmente falhem. Esta é a única grande regressão comparada aos scripts - "sempre examine sua saída" é a regra # 1 em TI, mas o systemd não parece se importar com isso ... - Além disso, esperava que o systemd fosse capaz de gerenciar o encerramento do serviço sem a solução alternativa "aguarde o PID morrer". No antigo script de init, eu tive que fazer isso manualmente, porque era um script, e o systemd está tentando eliminar a necessidade de scripts complexos para as mesmas coisas; elimina a necessidade de script manualmente em todos os timeouts e matar quem não morreu, mas "esperar o pid morrer" é a coisa mais comum, e ainda precisamos fazer um script.