Question Quel est le problème avec mon fichier de service Systemd?


J'ai essayé de faire fonctionner un service systemd pendant un certain temps, mais sans succès. Ce que j'essaie de faire est de créer un script de démarrage qui lancera un programme Java pour un serveur modded-Minecraft.

Voici le fichier de service systemd nommé ftbstart.service. Il est placé dans /etc/systemd/system/ et a des autorisations 744 (bien que j'ai testé une variété d'autorisations différentes).

[Unit]
Description=FTB Server
After=network.target

[Service]
Type=forking
User=root
Group=root
RemainAfterExit=yes

ExecStart=/usr/games/ftb/sstart.sh
ExecStop=/usr/games/ftb/sstop.sh

[Install]
WantedBy=multi-user.target

Donc, ExecStart lance un autre script avec des autorisations appelées 755 sstart.sh qui contient les lignes:

#!/bin/bash

echo I made it to 1
mount -t tmpfs -o size=1024M tmpfs /usr/games/ftb/current/
echo I made it to 2
cp -r /usr/games/ftb/beyond/. /usr/games/ftb/current/
echo I made it to 3
/usr/bin/screen -S ftb -d -m /usr/games/ftb/current/ServerStart.sh
echo I made it to 4

Les échos sont là pour le débogage. Le script s'exécute complètement, comme

journalctl -u ftbstart

affiche tous les échos de 1 à 4, mais la liste d’écrans n’affiche aucun écran actif après

systemctl restart ftbstart

Cependant si j'exécute le script /usr/games/ftb/sstart.sh du /bin/bash la ligne de commande fonctionne parfaitement et ne pose aucun problème.

Les choses que j'ai essayées jusqu'ici:

  • ajouter #!/bin/bash en haut de ftbstart.service fichier
  • enlever After=
  • changer / enlever Type= (Type=simple et Type=forking)
  • changer / enlever User= et Group=
  • modifier les autorisations de fichier sur les deux ftbstart.service et sstart.sh
  • en mettant ExecStart=/bin/bash /usr/games/ftb/sstart.sh

Je m'assure également de taper:

systemctl daemon-reload

et

systemctl restart ftbstart

chaque fois que je teste quelque chose dans le ftbstart.service fichier, etc etc et rien ne semble fonctionner.

J'ai aussi essayé d'ajouter la ligne

ExecStart=/usr/bin/screen -S ftb -d -m /usr/games/ftb/current/ServerStart.sh

à ftbstart.service mais il n'exécute toujours pas le service d'écran, mais

systemctl status ftbstart

montre juste quelque chose comme:

Active: active (exited) since Thu 2017-09-07 20:56:35 UTC; 32min ago

Cependant si je remplace cela ExecStart= dans ftbstart.service avec un tel que:

ExecStart=screen -S top -d -m /usr/bin/top

alors ça marche magiquement! Il crée un écran qui peut être attaché et affiche le moniteur de ressources en ligne de commande supérieur.

Donc, désolé pour la longue question, mais quelqu'un peut-il m'aider à comprendre ce que je fais mal? Je pense que c'est parce que je commence un autre script que le programme, mais que je ne suis pas certain que quelque chose ne va pas. Merci pour toute aide que vous pourriez fournir.

P.S. Si nécessaire, voici le script de démarrage lancé par sstart.sh. Je n'ai pas créé ceci, c'est le script fourni avec le modpack de minecraft: https://pastebin.com/muCy0xnh


3
2017-09-07 22:02


origine


Pourquoi copiez-vous des fichiers sur un tmpfs? Et l'écran est un programme interactif qui nécessite un terminal; vous ne pouvez pas l'exécuter depuis systemd. - psusi
@psusi Je copie des fichiers sur un tmpfs dans le but d'exécuter le monde Minecraft depuis un disque virtuel, ce qui est juste un peu plus rapide que de l'exécuter directement depuis le disque dur. Merci pour cette réponse, je n'ai trouvé aucune information suggérant cela dans tout mon googler. Est-ce que ça vous dérange si je vous envoie un message privé pour vous demander plus d'informations? Je ne veux pas sortir du sujet en posant plus de questions. - brdagr
Aussi, @psusi J'ai utilisé un fichier de service Systemd avec ExecStart = écran -S top -d -m / usr / bin / top et j'ai réussi à exécuter l'écran de Systemd, donc je ne sais pas pourquoi vous dites que c'est impossible . - brdagr
Avez-vous activé le service (sudo systemctl enable ftbstart.service)? Au-delà de cela, je vous recommande de diviser votre problème en morceaux plus petits et plus discrets qui faciliteront le dépannage. - richbl
La première chose à faire est d'ajouter 2>/tmp/foo.logaprès chacune des commandes exécutées par votre script puis vérifiez /tmp/foo.log pour tout message d'erreur. Vos instructions echo ne vous disent rien à savoir si les commandes ont été exécutées avec succès. - terdon♦


Réponses: