Systemd ne peut pas démarrer le script?

9

J'ai un script BASH que je veux exécuter au démarrage. Mon système exécute systemd, j'ai donc créé un fichier .service avec ce que je pense être les informations nécessaires:

[Unit]
Description=My Script
After=network.target

[Service]
ExecStart=/home/myscript.sh

[Install]
WantedBy=multi-user.target

J'ai utilisé systemctl enable pour «l'enregistrer» et le redémarrer. Au démarrage, on m'a dit que mon script serait exécuté, mais je ne pouvais voir aucun des messages qu'ECHO devrait afficher à l'écran ni écrire quelque chose dans un fichier, selon ce que j'avais écrit dans le script. De plus, il ne démarre pas l'application qu'il est censé démarrer.

L'état de Systemctl m'indique que le script s'est exécuté et s'est terminé avec succès. Pourtant, le script n'a aucun effet. Si je lance le script à partir d'un shell, cela fonctionne parfaitement bien.

Est-ce que l'un d'entre vous sait quel pourrait être mon problème?

TokyoMEWS
la source
3
Apparemment, si votre script commence autre chose, il a besoin de "Type = forking". Je me sens un peu stupide de ne pas avoir dérangé les paramètres plus tôt.
TokyoMEWS
1
+1 pour le résoudre. Veuillez poster votre solution en tant que réponse et l'accepter pour aider d'autres personnes ayant le même problème.
terdon
1
@TokyoMEWS: Plus précisément, si le script démarre autre chose et se termine pendant que ses enfants s'exécutent, il a besoin de "Type = forking".
user1686

Réponses:

7

En plus de ce que TokyoMEWS a trouvé par eux-mêmes ...

Apparemment, si votre script commence autre chose, il a besoin de "Type = forking"

(ce qui n'est pas tout à fait correct - Type=forkingne devient nécessaire que si votre script se ferme pendant que ses enfants s'exécutent )

... d'autres problèmes possibles sont:

  1. Je suppose que par "affichage à l'écran", vous vouliez dire que le script écrit simplement quelque chose sur stdout. Cela ne va pas à l'écran pendant le démarrage - plutôt, tout depuis la sortie standard d'un service est envoyé au journal (ou à syslog selon votre version de systemd).

  2. Si vous avez réellement essayer d' écriture à l'écran (par exemple à l' aide echo Hi >/dev/tty1), il est très probable que la sortie du script disparaît lorsque agetty efface l'écran avant d' afficher les invites de connexion. (Pour éviter cela, vous devrez commander l'unité [email protected]).

  3. Pour écrire quelque chose dans un fichier, vous devez avoir le système de fichiers monté en lecture-écriture. Pour cela, cela After=local-fs.target peut être nécessaire, sinon l'unité peut être redémarrée trop tôt. Mais cela dépend de la configuration spécifique du système d'exploitation.

user1686
la source
1

Si votre script définit également la clause ExecStop , vous devez définir " RemainAfterExit = yes" pour éviter que ExecStop soit appelé automatiquement après ExecStart . Cela permettra à votre service d'être dans l'état " actif " après avoir exécuté la commande ExecStart .

[Service]
ExecStart=/home/myscript.sh start
ExecStop=/home/myscript.sh stop
RemainAfterExit=yes
ibai
la source