# Hello world systemd

**URL:** <https://www.debian-fr.org/t/hello-world-systemd/77280>\
**Category:** Support Debian\
**Created:** [Juillet 25, 2018, 6:23 UTC](https://www.debian-fr.org/t/hello-world-systemd/77280 "2018-07-25T06:23:01Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![lelombric](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/da6949/32.png) [@lelombric](https://www.debian-fr.org/u/lelombric)\
**Post date:** [Juillet 25, 2018, 6:23 UTC](https://www.debian-fr.org/t/hello-world-systemd/77280/1 "2018-07-25T06:23:01Z")

</div>

Bonjour à tous,

J’ai lu pas mal de pages de manuel systemd, j’ai aussi consulté des blogs et autres ressources, pas moyen de créer un service perso.

J’ai commencé petit avec un script «&nbsp;hello world&nbsp;» :

> [@/etc/systemd/system/test.service](#):
>
> ```plaintext
> [Unit]
> After=default.target
> 
> [Install]
> WantedBy=default.target
> 
> [Service]
> Type=forking
> ExecStart=/home/serveur/test.sh
> 
> ```

et voici le script qui part ailleurs fonctionne dans la console :

> [@/home/serveur/test.sh](#):
>
> ```plaintext
> #!/bin/sh
> echo "Hello world" > /dev/tty
> 
> ```

C’est là que ça se corse : console en root

> [@\# systemctl start test](#):
>
> ```plaintext
> Job for test.service failed because the control process exited with error code.
> See "systemctl status test.service" and "journalctl -xe" for details.
> 
> ```

le status :

> [@\# systemctl status test](#):
>
> ```plaintext
> ● test.service
> Loaded: loaded (/etc/systemd/system/test.service; disabled; vendor preset: enabled)
> Active: failed (Result: exit-code) since Wed 2018-07-25 07:40:57 CEST; 6min ago
> Process: 1049 ExecStart=/home/serveur/test.sh (code=exited, status=203/EXEC)
> 
> juil. 25 07:40:57 Tournesol systemd[1]: Starting test.service...
> juil. 25 07:40:57 Tournesol systemd[1]: test.service: Control process exited, code=exited status=203
> juil. 25 07:40:57 Tournesol systemd[1]: Failed to start test.service.
> juil. 25 07:40:57 Tournesol systemd[1]: test.service: Unit entered failed state.
> juil. 25 07:40:57 Tournesol systemd[1]: test.service: Failed with result 'exit-code'.
> 
> ```

enfin le journal :

> [@\# journalctl -xe](#):
>
> ```plaintext
> juil. 25 07:47:24 Tournesol systemd[1]: Starting test.service...
> -- Subject: L'unité (unit) test.service a commencé à démarrer
> -- Defined-By: systemd
> -- Support: https://www.debian.org/support
> -- 
> -- L'unité (unit) test.service a commencé à démarrer.
> juil. 25 07:47:24 Tournesol systemd[1376]: test.service: Failed at step EXEC spawning /home/serveur/test.sh: Permission denied
> -- Subject: Le processus /home/serveur/test.sh n'a pas pu être exécuté
> -- Defined-By: systemd
> -- Support: https://www.debian.org/support
> -- 
> -- Le processus /home/serveur/test.sh n'a pas pu être exécuté, et a donc échoué.
> -- 
> -- Le code d'erreur renvoyé est 13.
> juil. 25 07:47:24 Tournesol systemd[1]: test.service: Control process exited, code=exited status=203
> juil. 25 07:47:24 Tournesol systemd[1]: Failed to start test.service.
> -- Subject: L'unité (unit) test.service a échoué
> -- Defined-By: systemd
> -- Support: https://www.debian.org/support
> -- 
> -- L'unité (unit) test.service a échoué, avec le résultat failed.
> juil. 25 07:47:24 Tournesol systemd[1]: test.service: Unit entered failed state.
> juil. 25 07:47:24 Tournesol systemd[1]: test.service: Failed with result 'exit-code'.
> 
> ```

Mais bref : le scrit ne passe pas, pourtant il s’exécute manuellement, n’a pas besoin de permission root ou autre. J’avais essayé le type=simple avant type=forking, mais en fouillant je suis tombé sur un message disant que pour un script shell, type=forking est nécessaire. Bref, je suis sûr qu’il me manque un petit bout de truc quelque part, mais je ne trouve pas où et c’est assez frustrant.

Si vous avez une idée pour me débloquer, je suis preneur 🙂

---

<div class="post-metadata">

**Author:** ![grandtoubab](https://www.debian-fr.org/user_avatar/www.debian-fr.org/grandtoubab/32/4505_2.png) [@grandtoubab](https://www.debian-fr.org/u/grandtoubab)\
**Post date:** [Juillet 25, 2018, 7:43 UTC](https://www.debian-fr.org/t/hello-world-systemd/77280/2 "2018-07-25T07:43:18Z")

</div>

Salut  
Puisque tu envois un script qui est dans ton home, as tu essayé de le faire en mode user ?  
[https://wiki.archlinux.fr/Systemd/utilisateur](https://wiki.archlinux.fr/Systemd/utilisateur)  
Dans ton home, dans ~/.config/systemd/user

les commande systemctl sont alors lancées en mode user: systemctl --user

Exemple je me suis bricolé un service alsa

```auto
systemctl --user status alsa-restore.service
● alsa-restore.service - Ma restauration des niveaux de son alsa
   Loaded: loaded (/home/guy/.config/systemd/user/alsa-restore.service; enabled;
   Active: inactive (dead) since Wed 2018-07-25 09:10:34 CEST; 27min ago
  Process: 1518 ExecStart=/usr/sbin/alsactl -f /home/guy/.config/alsa/save.asoun
  Process: 1315 ExecStartPre=/bin/sleep 15 (code=exited, status=0/SUCCESS)
 Main PID: 1518 (code=exited, status=0/SUCCESS)

juil. 25 09:10:18 debian systemd[1304]: Starting Ma restauration des niveaux de son
juil. 25 09:10:33 debian systemd[1304]: Started Ma restauration des niveaux de son

```

Pour toi, le pb étant dans quel tty systemd va-t-il écrire?

---

<div class="post-metadata">

**Author:** ![Sputnik93](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/35a633/32.png) [@Sputnik93](https://www.debian-fr.org/u/Sputnik93)\
**Post date:** [Juillet 25, 2018, 8:45 UTC](https://www.debian-fr.org/t/hello-world-systemd/77280/3 "2018-07-25T08:45:08Z")

</div>

> [@lelombric](#):
>
> je suis tombé sur un message disant que pour un script shell, type=forking est nécessaire

Ah non pas du tout, ce n’est pas lié au langage du programme à faire exécuter via systemd. J’ai des services systemd qui font tourner de bêtes scripts shell (même si les commandes dans ces scripts font appel à des commandes externes au shell, et donc, font de facto des forks), ce sont des type=simple  
La seule fois où j’ai dû utiliser type=forking c’était pour un script shell qui lance un exécutable java en lui passant les bonnes options.

---

<div class="post-metadata">

**Author:** ![lelombric](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/da6949/32.png) [@lelombric](https://www.debian-fr.org/u/lelombric)\
**Post date:** [Août 22, 2018, 2:25 UTC](https://www.debian-fr.org/t/hello-world-systemd/77280/4 "2018-08-22T14:25:59Z")

</div>

Bonjour à tous,

Je reviens sur le sujet.

Merci grandtoubab pour les conseils.

Voici à quoi ressemble mon test maintenant :

> [@/home/serveur/test.sh](#):
>
> #!/bin/sh  
> date +%c \>\> /home/serveur/testout.log

J’ai remplacé la partie tty par une simple redirection vers un fichier pour ne pas confondre les problèmes.

Le fichier de conf pour systemd ressemble à ça :

> [@/home/serveur/.config/systemd/user/montest.service](#):
>
> ```plaintext
> [Unit]
> After=default.target
> 
> [Install]
> WantedBy=default.target
> 
> [Service]
> Type=oneshot
> ExecStart=/home/serveur/test.sh
> 
> ```

et voici le script qui part ailleurs fonctionne dans la console :

> [@/home/serveur/test.sh](#):
>
> ```plaintext
> #!/bin/sh
> echo "Hello world" > /dev/tty
> 
> ```

J’ai remplacé le nom du service test par montest pour éviter un éventuel nom réservé.

Test du script seul :  
[quote =«&nbsp;$ sh ~/test.sh&nbsp;»]  
[/quote]  
[quote =«&nbsp;/home/serveur/testout.log&nbsp;»]

```plaintext
mer. 22 août 2018 15:59:17 CEST

```

[/quote]

Par contre, à priori, je n’arrive pas à faire fonctionner le systemd :

Console utilisateur classique :

> [@\# systemctl start montest](#):
>
> ```plaintext
> Failed to start montest.service: Unit montest.service not found.
> 
> ```

Avant de répondre, il me demande le mot de passe root dans une fenêtre de type popup, ce que je ne comprends pas très bien.  
Du coup, s’il execute la commande en root, est-ce qu’il cherche bien dans : «&nbsp;~/.config/systemd/user&nbsp;» et pas dans un truc qui serait : «&nbsp;/root/…&nbsp;» ?

Console en root :

> [@\# systemctl start montest](#):
>
> ```plaintext
> Failed to start montest.service: Unit montest.service not found.
> 
> ```

Je m’en doutais, mais en root, il ne trouve pas le service dans le répertoire «&nbsp;user&nbsp;».

En fouillant l’aide de systemd ou sur le web, pas moyen de trouver un fichier de config dans lequel je lui dit de regarder dans : ~/.config/systemd/user pour qu’il puisse trouver : montest.service  
Je n’ai pas non plus trouvé de moyen pour que mon utilisateur puisse faire lui même un «&nbsp;systemctl start xxx&nbsp;» lui même.

Merci Sputnik93, j’ai remplacé «&nbsp;forking&nbsp;» par «&nbsp;oneshot&nbsp;» qui me semblait moins source d’erreurs.

En tous cas, je suis toujours bloqué…

Des idées ?

---

<div class="post-metadata">

**Author:** ![grandtoubab](https://www.debian-fr.org/user_avatar/www.debian-fr.org/grandtoubab/32/4505_2.png) [@grandtoubab](https://www.debian-fr.org/u/grandtoubab)\
**Post date:** [Août 23, 2018, 7:43 UTC](https://www.debian-fr.org/t/hello-world-systemd/77280/5 "2018-08-23T07:43:20Z")

</div>

avec tes explications,je ne comprends pas si tu as véritablement utilisé le mode user  
en considérant que ce soit bien le cas , le service se lancerait depuis une fenetre terminal de ton utilisateur

```auto
systemctl --user start montest.service

```

De même pour vérifier l’état, exemple d’un service alsa perso que j’ai déclaré en mode user

```auto
 systemctl --user status alsa-restore
● alsa-restore.service - Ma restauration des niveaux de son alsa
   Loaded: loaded (/home/guy/.config/systemd/user/alsa-restore.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Thu 2018-08-23 09:25:17 CEST; 16min ago
  Process: 2681 ExecStart=/usr/sbin/alsactl -f /home/guy/.config/alsa/save.asound.state restore 0 (code=exited, status=0/SUCCESS)
  Process: 2516 ExecStartPre=/bin/sleep 15 (code=exited, status=0/SUCCESS)
 Main PID: 2681 (code=exited, status=0/SUCCESS)

août 23 09:25:02 debian systemd[2461]: Starting Ma restauration des niveaux de son alsa...
août 23 09:25:17 debian systemd[2461]: Started Ma restauration des niveaux de son alsa.

```

---

<div class="post-metadata">

**Author:** ![lelombric](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/da6949/32.png) [@lelombric](https://www.debian-fr.org/u/lelombric)\
**Post date:** [Août 24, 2018, 6:50 UTC](https://www.debian-fr.org/t/hello-world-systemd/77280/6 "2018-08-24T06:50:42Z")

</div>

Merci 😃

Effectivement, honte à moi, le retour à l’informatique n’est pas facile ☹

Voici les retours avec l’option --user :

Console en utilisateur lambda :

> [@$ systemctl --user start montest.service](#):
>
> ```plaintext
> Job for montest.service failed because the control process exited with error code.
> See "systemctl status montest.service" and "journalctl -xe" for details.
> 
> ```

le status :

> [@$ systemctl --user status montest](#):
>
> ```plaintext
> ● montest.service
> Loaded: loaded (/home/serveur/.config/systemd/user/montest.service; enabled; 
> Active: failed (Result: exit-code) since Fri 2018-08-24 08:29:01 CEST; 21s ag
> Process: 5950 ExecStart=/home/serveur/test.sh (code=exited, status=203/EXEC)
> Main PID: 5950 (code=exited, status=203/EXEC)
> 
> ```

enfin le journal : en mode root, sinon pas moyen de l’afficher.

> [@\# journalctl -xe](#):
>
> ```plaintext
> août 24 08:40:51 Tournesol systemd[467]: Starting montest.service...
> -- Subject: L'unité (unit) UNIT a commencé à démarrer
> -- Defined-By: systemd
> -- Support: https://www.debian.org/support
> -- 
> -- L'unité (unit) UNIT a commencé à démarrer.
> août 24 08:40:51 Tournesol systemd[6154]: montest.service: Failed at step EXEC spawning /home/serveur/test.sh: Permission denied
> -- Subject: Le processus /home/serveur/test.sh n'a pas pu être exécuté
> -- Defined-By: systemd
> -- Support: https://www.debian.org/support
> -- 
> -- Le processus /home/serveur/test.sh n'a pas pu être exécuté, et a donc échoué.
> -- 
> -- Le code d'erreur renvoyé est 13.
> août 24 08:40:51 Tournesol systemd[467]: montest.service: Main process exited, code=exited, status=203/EXEC
> août 24 08:40:51 Tournesol systemd[467]: Failed to start montest.service.
> -- Subject: L'unité (unit) UNIT a échoué
> -- Defined-By: systemd
> -- Support: https://www.debian.org/support
> -- 
> -- L'unité (unit) UNIT a échoué, avec le résultat failed.
> août 24 08:40:51 Tournesol systemd[467]: montest.service: Unit entered failed state.
> août 24 08:40:51 Tournesol systemd[467]: montest.service: Failed with result 'exit-code'.
> 
> ```

Mais bref : le scrit ne passe toujours pas, pourtant il s’exécute manuellement, n’a pas besoin de permission root ou autre.

Malgré les simplifications et modifications, le script ne tourne pas. Et le message «&nbsp;permission denied&nbsp;» me laisse perplexe. 🙂

Sur d’autre discussions, je peux voir des personnes ajouter /bin/bash devant le script au niveau du ExecStart pour le service mais je ne vois pas bien à quoi cela sert, c’est une piste ?

---

<div class="post-metadata">

**Author:** ![grandtoubab](https://www.debian-fr.org/user_avatar/www.debian-fr.org/grandtoubab/32/4505_2.png) [@grandtoubab](https://www.debian-fr.org/u/grandtoubab)\
**Post date:** [Août 24, 2018, 11:13 UTC](https://www.debian-fr.org/t/hello-world-systemd/77280/7 "2018-08-24T11:13:52Z")

</div>

c’est surtout pour éviter de se prendre la tête avec les erreurs d’écriture dans le script car chaque shell a ses finesses  
Donc autant etre cohérent et utiliser le bon shell  
ça se vérifie dans les variables d’environnement

Exemple chez moi:

```auto
debian:~$ env | grep -i shell 
SHELL=/bin/bash

```

NB si tu donnais simplement le contenu intégral de ton script ça faciliterai les choses …par exemple dans un script il est toujours mieux de travailler en chemin absolu

ton script est il bien exécutable?  
as tu fais chmod +x

---

<div class="post-metadata">

**Author:** ![lelombric](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/da6949/32.png) [@lelombric](https://www.debian-fr.org/u/lelombric)\
**Post date:** [Août 24, 2018, 1:48 UTC](https://www.debian-fr.org/t/hello-world-systemd/77280/8 "2018-08-24T13:48:51Z")

</div>

Oui le script fonctionne tout seul :

Le texte complet :

> [@/home/serveur/test.sh](#):
>
> ```plaintext
> #!/bin/sh
> date +%c >> /home/serveur/testout.log
> 
> ```

Test du script seul en console utilisateur :  
[quote =«&nbsp;$ sh ~/test.sh&nbsp;»]  
[/quote]  
[quote =«&nbsp;/home/serveur/testout.log&nbsp;»]

```plaintext
mer. 22 août 2018 15:59:17 CEST

```

[/quote]

---

<div class="post-metadata">

**Author:** ![grandtoubab](https://www.debian-fr.org/user_avatar/www.debian-fr.org/grandtoubab/32/4505_2.png) [@grandtoubab](https://www.debian-fr.org/u/grandtoubab)\
**Post date:** [Août 24, 2018, 2:58 UTC](https://www.debian-fr.org/t/hello-world-systemd/77280/9 "2018-08-24T14:58:19Z")

</div>

oui ok mais tu le lances avec la commande sh  
Ce qui ne réponds pas à la question: "le script est il executable?"  
pour vérifier

`ls -ll /home/serveur/test.sh`

s’il est exécutable tu dois voir le caractère x  
On peut voir cinq lettres différentes. Voici leur signification :

d (Directory) : indique si l’élément est un dossier ;

l (Link) : indique si l’élément est un lien (raccourci) ;

r (Read) : indique si on peut lire l’élément ;

w (Write) : indique si on peut modifier l’élément ;

x (eXecute) : si c’est un fichier, « x » indique qu’on peut l’exécuter.

---

<div class="post-metadata">

**Author:** ![lelombric](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/da6949/32.png) [@lelombric](https://www.debian-fr.org/u/lelombric)\
**Post date:** [Août 24, 2018, 3:13 UTC](https://www.debian-fr.org/t/hello-world-systemd/77280/10 "2018-08-24T15:13:01Z")

</div>

Lorsque j’avais essayé de faire sh sur mon premier script, il m’avait envoyé bouler, ce que j’avais résolu en cochant exécutable dans les autorisations (je dis ça de tête, c’est pas très fiable du coup).  
Je vérifie ce soir.

---

<div class="post-metadata">

**Author:** ![lelombric](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/da6949/32.png) [@lelombric](https://www.debian-fr.org/u/lelombric)\
**Post date:** [Août 24, 2018, 5:48 UTC](https://www.debian-fr.org/t/hello-world-systemd/77280/11 "2018-08-24T17:48:02Z")

</div>

Ok, alors, j’ai progressé.

Maintenant, effectivement, le service fonctionne.

J’ai essayé de changer la redirection vers le fichier en redirection vers tty et comme tu le disais, grandtoubab, il y a un soucis avec tty 🤔

Le texte complet du script :

> [@/home/serveur/test.sh](#):
>
> ```plaintext
> #!/bin/sh
> echo "Hello world" > /dev/tty
> 
> ```

Test du script seul en console utilisateur :  
[quote =«&nbsp;$ sh ~/test.sh&nbsp;»]  
Hello world  
[/quote]  
«&nbsp;Hello world&nbsp;» apparait dans la même console.

Console en utilisateur lambda :

> [@$ systemctl --user start montest.service](#):
>
> ```plaintext
> Job for montest.service failed because the control process exited with error code.
> See "systemctl status montest.service" and "journalctl -xe" for details.
> 
> ```

le status :

> [@$ systemctl --user status montest](#):
>
> ```plaintext
> ● montest.service
> Loaded: loaded (/home/serveur/.config/systemd/user/montest.service; enabled; 
> Active: failed (Result: exit-code) since Fri 2018-08-24 19:28:53 CEST; 15s ag
> Process: 1198 ExecStart=/home/serveur/test.sh (code=exited, status=2)
> Main PID: 1198 (code=exited, status=2)
> 
> ```

enfin le journal :

> [@\# journalctl -xe](#):
>
> ```plaintext
> -- L'unité (unit) UNIT a commencé à démarrer.
> août 24 19:28:53 Tournesol test.sh[1198]: /home/serveur/test.sh: 14: /home/serveur/test.sh: cannot create /dev/tty: No such device or address
> août 24 19:28:53 Tournesol systemd[473]: montest.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
> août 24 19:28:53 Tournesol systemd[473]: Failed to start montest.service.
> -- Subject: L'unité (unit) UNIT a échoué
> -- Defined-By: systemd
> -- Support: https://www.debian.org/support
> -- 
> -- L'unité (unit) UNIT a échoué, avec le résultat failed.
> août 24 19:28:53 Tournesol systemd[473]: montest.service: Unit entered failed state.
> août 24 19:28:53 Tournesol systemd[473]: montest.service: Failed with result 'exit-code'
> 
> ```

Bon, je pars me documenter sur systemd et tty.

Merci pour le coup de main.

---

<div class="post-metadata">

**Author:** ![Verner](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/34f0e0/32.png) [@Verner](https://www.debian-fr.org/u/Verner)\
**Post date:** [Août 24, 2018, 6:53 UTC](https://www.debian-fr.org/t/hello-world-systemd/77280/12 "2018-08-24T18:53:09Z")

</div>

Une suggestion en passant…  
Plutôt que de te prendre la tête avec systemd en user, pourquoi n’utilises-tu pas **cron**??  
1 - tu testes ton script bash dans un terminal  
2 - crontab -e

ps: cron est géré par systemd.

---

<div class="post-metadata">

**Author:** ![lelombric](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/da6949/32.png) [@lelombric](https://www.debian-fr.org/u/lelombric)\
**Post date:** [Août 24, 2018, 7:46 UTC](https://www.debian-fr.org/t/hello-world-systemd/77280/13 "2018-08-24T19:46:50Z")

</div>

Bonsoir Verner,

En fait c’est la première solution que j’ai testé.

Prérequis pour suivre le reste : mon script doit se lancer au démarrage du pc, avec à minima un accès réseau voir d’autres pré-requis si java en a.

Voici tout ce que j’ai fait en détails, vous pourrez peut-être corriger certaines erreurs.

1. Passer mes scripts sous cron  
Première déconvenue, cela n’a pas marché.  
J’ai essayé une ligne avec le mot clé @reboot : mon appli n’était pas détectée alors qu’elle se lance sans problème à la main.  
–\> J’ai soupçonné un soucis d’ordre de lancement au boot.  
Pour essayer de débuger, j’ai voulu afficher mon script dans une console, j’ai donc essayé quelque chose du genre :  
xterm -hold -e sh [monscript.sh](http://monscript.sh)  
–\> Toujours des erreurs et pas de fenêtre xterm

2. J’ai essayé de rediriger mon script dans une fenêtre tty, de la même manière que dans le dernier “hello world” que j’ai présenté :  
–\> Toujours pas de fenêtre.

3. J’ai compris de mes lectures en diagonale de plusieurs articles que systemd gérait plus précisément à quel moment se lançaient les scripts notamment au boot et que systemd semble se démocratiser, j’ai donc décider d’essayer d’y passer.  
–\> On est donc arrivé à ce post et j’essaie maintenant d’avance sur mon vrai problème, mais je suis content d’avoir réussi à créer mon premier service systemd fonctionnel.

En tout cas, merci à tous pour vos idées 😃

---

<div class="post-metadata">

**Author:** ![Verner](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/34f0e0/32.png) [@Verner](https://www.debian-fr.org/u/Verner)\
**Post date:** [Août 24, 2018, 8:07 UTC](https://www.debian-fr.org/t/hello-world-systemd/77280/14 "2018-08-24T20:07:20Z")

</div>

Effectivement s’il y a un prérequis de connexion réseau, cron va manquer de flexibilité et systemd est adapté.  
Mais comme ce n’est pas script user mais plutôt système, il faut peut-être placer le service directement dans **/lib/systemd/system/** , soit test.service et essayer:

```
sudo systemctl enable test.service

```

Peut-être essayer cette condition:

```
[Unit]
After=systemd-udevd.service network-pre.target systemd-sysctl.service

```

ps: déjà être sûr à 100% que le script bash appelé fonctionne correctement
