Prérequis
- Un serveur sous Ubuntu, Debian, AlmaLinux, Rocky, CentOS, Fedora, Alpine ou openSUSE : voir nos VPS au Canada
- Une connexion SSH ouverte en root : Se connecter en SSH à votre VPS
systemd démarre le système et fait vivre les services : il les lance au démarrage, les surveille, les relance et garde leur journal. Ce guide montre les commandes du quotidien sur un service existant, puis crée un service de A à Z (un script qui tourne en permanence), lit son journal, le fait revenir tout seul après un plantage, ajoute une tâche planifiée (une sauvegarde de /etc chaque nuit) et provoque deux pannes classiques pour apprendre à les lire. Alpine n'utilise pas systemd mais OpenRC : chaque étape montre son équivalent. Choisissez votre système ci-dessus. Copiez la commande avec le bouton Copier, collez-la dans votre terminal, et comparez avec le résultat attendu.
1Mettre à jour le système
apt update && apt upgrade -y... 212 upgraded, 8 newly installed, 0 to remove and 4 not upgraded. (les nombres dépendent de l'âge de l'image)
dnf upgrade -y... Complete!
dnf upgrade -y... Complete!
apk update && apk upgrade && reboot... OK: 158 MiB in 209 packages (les nombres dépendent de l'image ; la connexion SSH se coupe au redémarrage)
Alpine redémarre après la mise à jour : quand elle remplace le noyau, les modules du noyau en cours disparaissent, et le système ne peut plus en charger aucun avant de redémarrer sur le nouveau. Reconnectez-vous en SSH après une minute.
zypper -n refresh && zypper -n updateAll repositories have been refreshed. ...
2Voir l'état des services
Tout passe par systemctl (rc-service et rc-status sur Alpine). Premier réflexe devant un serveur : l'état du service SSH, celui par lequel vous êtes entré.
systemctl status ssh● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/usr/lib/systemd/system/ssh.service; enabled; preset: enabled)
Active: active (running) since Thu 2026-09-17 18:17:18 UTC; 17s ago
Main PID: 7997 (sshd)
...
(Debian 13 ; sur Ubuntu 24.04, sshd est lancé à la demande par ssh.socket : ssh.service s'affiche « inactive (dead) » avec « TriggeredBy: ● ssh.socket », et SSH répond quand même)systemctl status sshd● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; preset: enabled)
Active: active (running) since Thu 2026-09-17 18:20:38 UTC; 1min 11s ago
...
Main PID: 41613 (sshd)
...systemctl status sshd● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; preset: enabled)
...
Active: active (running) since Thu 2026-09-17 18:18:58 UTC; 3s ago
...rc-service sshd status* status: started
systemctl status sshd● sshd.service - OpenSSH Daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; preset: disabled)
Active: active (running) since Thu 2026-09-17 21:20:00 EEST; 4s ago
...
Main PID: 17535 (sshd)
...Trois lignes comptent : Loaded (le fichier du service et s'il est activé au démarrage : enabled ou disabled), Active (en marche : active (running), arrêté : inactive (dead), en échec : failed) et Main PID (le processus). Les dernières lignes du journal suivent.
Trois lignes comptent : Loaded (le fichier du service et s'il est activé au démarrage : enabled ou disabled), Active (en marche : active (running), arrêté : inactive (dead), en échec : failed) et Main PID (le processus). Les dernières lignes du journal suivent.
Trois lignes comptent : Loaded (le fichier du service et s'il est activé au démarrage : enabled ou disabled), Active (en marche : active (running), arrêté : inactive (dead), en échec : failed) et Main PID (le processus). Les dernières lignes du journal suivent.
Trois lignes comptent : Loaded (le fichier du service et s'il est activé au démarrage : enabled ou disabled), Active (en marche : active (running), arrêté : inactive (dead), en échec : failed) et Main PID (le processus). Les dernières lignes du journal suivent.
rc-service répond started ou stopped. rc-status montre les services de chaque niveau d'exécution (default est celui du démarrage normal) et rc-update ceux qui y sont inscrits.
systemctl list-units --type=service --state=runningUNIT LOAD ACTIVE SUB DESCRIPTION cron.service loaded active running Regular background program processing daemon dbus.service loaded active running D-Bus System Message Bus ... systemd-journald.service loaded active running Journal Service ... 20 loaded units listed. (la liste dépend de ce qui est installé)
systemctl list-units --type=service --state=runningUNIT LOAD ACTIVE SUB DESCRIPTION auditd.service loaded active running Security Auditing Service chronyd.service loaded active running NTP client/server crond.service loaded active running Command Scheduler ... sshd.service loaded active running OpenSSH server daemon ... 20 loaded units listed. (la liste dépend de ce qui est installé)
systemctl list-units --type=service --state=runningUNIT LOAD ACTIVE SUB DESCRIPTION auditd.service loaded active running Security Auditing Service chronyd.service loaded active running NTP client/server ... sshd.service loaded active running OpenSSH server daemon ... 20 loaded units listed. (la liste dépend de ce qui est installé)
rc-statusRunlevel: default networking [ started ] ... chronyd [ started ] qemu-guest-agent [ started ] sshd [ started ] Dynamic Runlevel: hotplugged Dynamic Runlevel: needed/wanted sysfs [ started ] ...
systemctl list-units --type=service --state=runningUNIT LOAD ACTIVE SUB DESCRIPTION chronyd.service loaded active running NTP client/server dbus-broker.service loaded active running D-Bus System Message Bus firewalld.service loaded active running firewalld - dynamic firewall daemon ... sshd.service loaded active running OpenSSH Daemon ... 18 loaded units listed. (la liste dépend de ce qui est installé)
systemctl --failedUNIT LOAD ACTIVE SUB DESCRIPTION 0 loaded units listed. (un service en échec s'affiche ici en rouge, avec failed dans les colonnes ACTIVE et SUB)
systemctl --failedUNIT LOAD ACTIVE SUB DESCRIPTION ● mcelog.service loaded failed failed Machine Check Exception Logging Daemon ... 1 loaded units listed. (un service en échec ici n'est pas forcément un problème : certains échouent dans une machine virtuelle, sans conséquence)
systemctl --failedUNIT LOAD ACTIVE SUB DESCRIPTION 0 loaded units listed. (un service en échec s'affiche ici en rouge, avec failed dans les colonnes ACTIVE et SUB)
rc-update show default chronyd | default
cloud-config | default
cloud-final | default
cloud-init | default
cloud-init-hotplugd | default
networking | default
qemu-guest-agent | default
sshd | defaultsystemctl --failedUNIT LOAD ACTIVE SUB DESCRIPTION ● audit-rules.service loaded failed failed Load Audit Rules ● klog.service loaded failed failed Early Kernel Boot Messages ... 2 loaded units listed. (deux services du démarrage, sans conséquence dans une machine virtuelle)
systemctl list-unit-files --type=service --state=enabledUNIT FILE STATE PRESET apparmor.service enabled enabled ... cron.service enabled enabled ... ufw.service enabled enabled ... 45 unit files listed. (le nombre dépend de ce qui est installé)
systemctl list-unit-files --type=service --state=enabledUNIT FILE STATE PRESET ... sshd.service enabled enabled ... 34 unit files listed.
systemctl list-unit-files --type=service --state=enabledUNIT FILE STATE PRESET ... sshd.service enabled enabled ... (le nombre dépend de ce qui est installé)
systemctl list-unit-files --type=service --state=enabledUNIT FILE STATE PRESET ... sshd.service enabled enabled ... (le nombre dépend de ce qui est installé)
3Créer un service
Le service s'appelle sonde : un petit script qui écrit une ligne toutes les 30 secondes, de quoi le voir vivre dans le journal. Il est écrit dans /usr/local/bin, et sa définition dans /etc/systemd/system, le dossier des services que vous créez (ceux des paquets vivent dans /usr/lib/systemd/system).
Le service s'appelle sonde : un petit script qui écrit une ligne toutes les 30 secondes, de quoi le voir vivre dans le journal. Il est écrit dans /usr/local/bin, et sa définition dans /etc/systemd/system, le dossier des services que vous créez (ceux des paquets vivent dans /usr/lib/systemd/system).
Le service s'appelle sonde : un petit script qui écrit une ligne toutes les 30 secondes, de quoi le voir vivre dans le journal. Il est écrit dans /usr/local/bin, et sa définition dans /etc/systemd/system, le dossier des services que vous créez (ceux des paquets vivent dans /usr/lib/systemd/system).
Le service s'appelle sonde : un petit script qui écrit une ligne toutes les 30 secondes, de quoi le voir vivre dans le journal. Il est écrit dans /usr/local/bin, et sa définition dans /etc/systemd/system, le dossier des services que vous créez (ceux des paquets vivent dans /usr/lib/systemd/system).
Le service s'appelle sonde : un petit script qui écrit une ligne toutes les 30 secondes, de quoi le voir vivre dans le journal. Il est écrit dans /usr/local/bin, et son script OpenRC dans /etc/init.d, surveillé par supervise-daemon.
cat > /usr/local/bin/sonde.sh << 'EOF'
#!/bin/sh
while true; do
echo "sonde vivante, charge : $(cut -d ' ' -f 1-3 /proc/loadavg)"
sleep 30
done
EOF
chmod +x /usr/local/bin/sonde.shcat > /etc/systemd/system/sonde.service << 'EOF'
[Unit]
Description=Sonde de demonstration
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/sonde.sh
Restart=always
RestartSec=5
DynamicUser=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now sondeCreated symlink /etc/systemd/system/multi-user.target.wants/sonde.service → /etc/systemd/system/sonde.service.
cat > /etc/systemd/system/sonde.service << 'EOF'
[Unit]
Description=Sonde de demonstration
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/sonde.sh
Restart=always
RestartSec=5
DynamicUser=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now sondeCreated symlink /etc/systemd/system/multi-user.target.wants/sonde.service → /etc/systemd/system/sonde.service.
cat > /etc/systemd/system/sonde.service << 'EOF'
[Unit]
Description=Sonde de demonstration
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/sonde.sh
Restart=always
RestartSec=5
DynamicUser=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now sondeCreated symlink /etc/systemd/system/multi-user.target.wants/sonde.service → /etc/systemd/system/sonde.service.
cat > /etc/systemd/system/sonde.service << 'EOF'
[Unit]
Description=Sonde de demonstration
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/sonde.sh
Restart=always
RestartSec=5
DynamicUser=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now sondeCreated symlink /etc/systemd/system/multi-user.target.wants/sonde.service → /etc/systemd/system/sonde.service.
cat > /etc/init.d/sonde << 'EOF'
#!/sbin/openrc-run
description="Sonde de demonstration"
command="/usr/local/bin/sonde.sh"
command_user="nobody"
supervisor="supervise-daemon"
output_logger="logger -t sonde"
error_logger="logger -t sonde"
depend() {
need net
}
EOF
chmod +x /etc/init.d/sonde
rc-update add sonde default
rc-service sonde start* service sonde added to runlevel default * Caching service dependencies ... [ ok ] * Starting sonde ... [ ok ]
[Unit] décrit et ordonne : After=network.target, après le réseau. [Service] dit quoi lancer (ExecStart), quoi faire s'il s'arrête (Restart=always, après RestartSec=5 secondes) et sous quel utilisateur : DynamicUser=yes fait créer par systemd un utilisateur jetable, nommé comme le service, sans droits sur le reste de la machine. [Install] dit quand le démarrer : WantedBy=multi-user.target, le démarrage normal. daemon-reload fait relire les fichiers ; enable --now active au démarrage et lance tout de suite.
[Unit] décrit et ordonne : After=network.target, après le réseau. [Service] dit quoi lancer (ExecStart), quoi faire s'il s'arrête (Restart=always, après RestartSec=5 secondes) et sous quel utilisateur : DynamicUser=yes fait créer par systemd un utilisateur jetable, nommé comme le service, sans droits sur le reste de la machine. [Install] dit quand le démarrer : WantedBy=multi-user.target, le démarrage normal. daemon-reload fait relire les fichiers ; enable --now active au démarrage et lance tout de suite.
[Unit] décrit et ordonne : After=network.target, après le réseau. [Service] dit quoi lancer (ExecStart), quoi faire s'il s'arrête (Restart=always, après RestartSec=5 secondes) et sous quel utilisateur : DynamicUser=yes fait créer par systemd un utilisateur jetable, nommé comme le service, sans droits sur le reste de la machine. [Install] dit quand le démarrer : WantedBy=multi-user.target, le démarrage normal. daemon-reload fait relire les fichiers ; enable --now active au démarrage et lance tout de suite.
[Unit] décrit et ordonne : After=network.target, après le réseau. [Service] dit quoi lancer (ExecStart), quoi faire s'il s'arrête (Restart=always, après RestartSec=5 secondes) et sous quel utilisateur : DynamicUser=yes fait créer par systemd un utilisateur jetable, nommé comme le service, sans droits sur le reste de la machine. [Install] dit quand le démarrer : WantedBy=multi-user.target, le démarrage normal. daemon-reload fait relire les fichiers ; enable --now active au démarrage et lance tout de suite.
command est le programme, command_user l'utilisateur qui le fait tourner (nobody, sans droits), supervisor=supervise-daemon le surveillant qui le relance s'il tombe, output_logger et error_logger envoient ce qu'il écrit au journal système (/var/log/messages, étiqueté sonde) et depend() dit d'attendre le réseau. rc-update add l'ajoute au niveau default, celui du démarrage normal.
systemctl status sonde● sonde.service - Sonde de demonstration
Loaded: loaded (/etc/systemd/system/sonde.service; enabled; preset: enabled)
Active: active (running) since Thu 2026-09-17 18:26:27 UTC; 2s ago
Main PID: 29583 (sonde.sh)
Tasks: 2 (limit: 9480)
Memory: 616.0K (peak: 744.0K)
CPU: 6ms
CGroup: /system.slice/sonde.service
├─29583 /bin/sh /usr/local/bin/sonde.sh
└─29586 sleep 30
Sep 17 18:26:27 serveur systemd[1]:Started sonde.service - Sonde de demonstration.
Sep 17 18:26:27 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.11 0.12systemctl status sonde● sonde.service - Sonde de demonstration
Loaded: loaded (/etc/systemd/system/sonde.service; enabled; preset: enabled)
Active: active (running) since Thu 2026-09-17 18:26:27 UTC; 2s ago
Main PID: 29583 (sonde.sh)
Tasks: 2 (limit: 9480)
Memory: 616.0K (peak: 744.0K)
CPU: 6ms
CGroup: /system.slice/sonde.service
├─29583 /bin/sh /usr/local/bin/sonde.sh
└─29586 sleep 30
Sep 17 18:26:27 serveur systemd[1]:Started sonde.service - Sonde de demonstration.
Sep 17 18:26:27 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.11 0.12systemctl status sonde● sonde.service - Sonde de demonstration
Loaded: loaded (/etc/systemd/system/sonde.service; enabled; preset: enabled)
Active: active (running) since Thu 2026-09-17 18:26:27 UTC; 2s ago
Main PID: 29583 (sonde.sh)
Tasks: 2 (limit: 9480)
Memory: 616.0K (peak: 744.0K)
CPU: 6ms
CGroup: /system.slice/sonde.service
├─29583 /bin/sh /usr/local/bin/sonde.sh
└─29586 sleep 30
Sep 17 18:26:27 serveur systemd[1]:Started sonde.service - Sonde de demonstration.
Sep 17 18:26:27 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.11 0.12systemctl status sonde● sonde.service - Sonde de demonstration
Loaded: loaded (/etc/systemd/system/sonde.service; enabled; preset: enabled)
Active: active (running) since Thu 2026-09-17 18:26:27 UTC; 2s ago
Main PID: 29583 (sonde.sh)
Tasks: 2 (limit: 9480)
Memory: 616.0K (peak: 744.0K)
CPU: 6ms
CGroup: /system.slice/sonde.service
├─29583 /bin/sh /usr/local/bin/sonde.sh
└─29586 sleep 30
Sep 17 18:26:27 serveur systemd[1]:Started sonde.service - Sonde de demonstration.
Sep 17 18:26:27 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.11 0.12rc-service sonde status* status: started
4Lire le journal
systemd garde tout ce que le service écrit (et tout ce qu'il lui arrive) dans le journal, que journalctl filtre par service, par période ou par gravité.
systemd garde tout ce que le service écrit (et tout ce qu'il lui arrive) dans le journal, que journalctl filtre par service, par période ou par gravité.
systemd garde tout ce que le service écrit (et tout ce qu'il lui arrive) dans le journal, que journalctl filtre par service, par période ou par gravité.
systemd garde tout ce que le service écrit (et tout ce qu'il lui arrive) dans le journal, que journalctl filtre par service, par période ou par gravité.
Le service écrit dans /var/log/messages, avec l'étiquette sonde.
journalctl -u sonde -n 5Sep 17 18:26:27 serveur systemd[1]:Started sonde.service - Sonde de demonstration. Sep 17 18:26:27 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.11 0.12 Sep 17 18:26:57 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.10 0.12 ...
journalctl -u sonde -n 5Sep 17 18:26:27 serveur systemd[1]:Started sonde.service - Sonde de demonstration. Sep 17 18:26:27 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.11 0.12 Sep 17 18:26:57 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.10 0.12 ...
journalctl -u sonde -n 5Sep 17 18:26:27 serveur systemd[1]:Started sonde.service - Sonde de demonstration. Sep 17 18:26:27 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.11 0.12 Sep 17 18:26:57 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.10 0.12 ...
journalctl -u sonde -n 5Sep 17 18:26:27 serveur systemd[1]:Started sonde.service - Sonde de demonstration. Sep 17 18:26:27 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.11 0.12 Sep 17 18:26:57 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.10 0.12 ...
grep 'sonde:' /var/log/messages | tail -n 5Sep 17 18:26:34 serveur user.notice sonde: sonde vivante, charge : 0.00 0.00 0.00 Sep 17 18:27:04 serveur user.notice sonde: sonde vivante, charge : 0.00 0.00 0.00 ...
journalctl -u sonde -fSep 17 18:26:57 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.10 0.12 (une nouvelle ligne toutes les 30 secondes)
journalctl -u sonde -fSep 17 18:26:57 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.10 0.12 (une nouvelle ligne toutes les 30 secondes)
journalctl -u sonde -fSep 17 18:26:57 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.10 0.12 (une nouvelle ligne toutes les 30 secondes)
journalctl -u sonde -fSep 17 18:26:57 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.10 0.12 (une nouvelle ligne toutes les 30 secondes)
tail -f /var/log/messages | grep 'sonde:'Sep 17 18:27:04 serveur user.notice sonde: sonde vivante, charge : 0.00 0.00 0.00 (une nouvelle ligne toutes les 30 secondes)
journalctl -u sonde --since "5 min ago"Sep 17 18:17:36 serveur systemd[1]:Started sonde.service - Sonde de demonstration. Sep 17 18:17:36 serveur sonde.sh[10648]: sonde vivante, charge : 0.89 0.48 0.25 Sep 17 18:18:06 serveur sonde.sh[10648]: sonde vivante, charge : 0.54 0.44 0.24
journalctl -u sonde --since "5 min ago"Sep 17 18:17:36 serveur systemd[1]:Started sonde.service - Sonde de demonstration. Sep 17 18:17:36 serveur sonde.sh[10648]: sonde vivante, charge : 0.89 0.48 0.25 Sep 17 18:18:06 serveur sonde.sh[10648]: sonde vivante, charge : 0.54 0.44 0.24
journalctl -u sonde --since "5 min ago"Sep 17 18:17:36 serveur systemd[1]:Started sonde.service - Sonde de demonstration. Sep 17 18:17:36 serveur sonde.sh[10648]: sonde vivante, charge : 0.89 0.48 0.25 Sep 17 18:18:06 serveur sonde.sh[10648]: sonde vivante, charge : 0.54 0.44 0.24
journalctl -u sonde --since "5 min ago"Sep 17 18:17:36 serveur systemd[1]:Started sonde.service - Sonde de demonstration. Sep 17 18:17:36 serveur sonde.sh[10648]: sonde vivante, charge : 0.89 0.48 0.25 Sep 17 18:18:06 serveur sonde.sh[10648]: sonde vivante, charge : 0.54 0.44 0.24
journalctl -p err -bSep 17 18:18:21 serveur systemd-networkd-wait-online[4009]: Timeout occurred while waiting for network connectivity. Sep 17 18:18:21 serveur systemd[1]:Failed to start systemd-networkd-wait-online.service - Wait for Network to be Configured. (vos lignes diffèrent : c'est là qu'on regarde quand un service ne répond pas)
journalctl -p err -bSep 17 18:18:21 serveur systemd-networkd-wait-online[4009]: Timeout occurred while waiting for network connectivity. Sep 17 18:18:21 serveur systemd[1]:Failed to start systemd-networkd-wait-online.service - Wait for Network to be Configured. (vos lignes diffèrent : c'est là qu'on regarde quand un service ne répond pas)
journalctl -p err -bSep 17 18:18:21 serveur systemd-networkd-wait-online[4009]: Timeout occurred while waiting for network connectivity. Sep 17 18:18:21 serveur systemd[1]:Failed to start systemd-networkd-wait-online.service - Wait for Network to be Configured. (vos lignes diffèrent : c'est là qu'on regarde quand un service ne répond pas)
journalctl -p err -bSep 17 18:18:21 serveur systemd-networkd-wait-online[4009]: Timeout occurred while waiting for network connectivity. Sep 17 18:18:21 serveur systemd[1]:Failed to start systemd-networkd-wait-online.service - Wait for Network to be Configured. (vos lignes diffèrent : c'est là qu'on regarde quand un service ne répond pas)
5Arrêter, démarrer, désactiver
stop arrête maintenant, disable retire du démarrage : les deux sont indépendants. Un service désactivé continue de tourner jusqu'au prochain redémarrage de la machine, et un service arrêté reviendra au démarrage s'il est toujours activé. is-active et is-enabled répondent en un mot, pratique dans un script.
stop arrête maintenant, disable retire du démarrage : les deux sont indépendants. Un service désactivé continue de tourner jusqu'au prochain redémarrage de la machine, et un service arrêté reviendra au démarrage s'il est toujours activé. is-active et is-enabled répondent en un mot, pratique dans un script.
stop arrête maintenant, disable retire du démarrage : les deux sont indépendants. Un service désactivé continue de tourner jusqu'au prochain redémarrage de la machine, et un service arrêté reviendra au démarrage s'il est toujours activé. is-active et is-enabled répondent en un mot, pratique dans un script.
stop arrête maintenant, disable retire du démarrage : les deux sont indépendants. Un service désactivé continue de tourner jusqu'au prochain redémarrage de la machine, et un service arrêté reviendra au démarrage s'il est toujours activé. is-active et is-enabled répondent en un mot, pratique dans un script.
rc-service stop arrête maintenant, rc-update del retire du démarrage : les deux sont indépendants. Un service retiré du niveau default continue de tourner jusqu'au prochain redémarrage de la machine, et un service arrêté reviendra au démarrage s'il y est toujours inscrit.
systemctl stop sonde && systemctl is-active sondeinactive
systemctl stop sonde && systemctl is-active sondeinactive
systemctl stop sonde && systemctl is-active sondeinactive
systemctl stop sonde && systemctl is-active sondeinactive
rc-service sonde stop && rc-service sonde status* Stopping sonde ... [ ok ] * status: stopped
systemctl start sonde && systemctl is-active sondeactive
systemctl start sonde && systemctl is-active sondeactive
systemctl start sonde && systemctl is-active sondeactive
systemctl start sonde && systemctl is-active sondeactive
rc-service sonde start && rc-service sonde status* Starting sonde ... [ ok ] * status: started
systemctl restart sondesystemctl restart sondesystemctl restart sondesystemctl restart sonderc-service sonde restart* Stopping sonde ... [ ok ] * Starting sonde ... [ ok ]
systemctl disable sonde && systemctl is-enabled sondeRemoved "/etc/systemd/system/multi-user.target.wants/sonde.service". disabled
systemctl disable sonde && systemctl is-enabled sondeRemoved "/etc/systemd/system/multi-user.target.wants/sonde.service". disabled
systemctl disable sonde && systemctl is-enabled sondeRemoved "/etc/systemd/system/multi-user.target.wants/sonde.service". disabled
systemctl disable sonde && systemctl is-enabled sondeRemoved "/etc/systemd/system/multi-user.target.wants/sonde.service". disabled
rc-update del sonde* service sonde deleted from runlevel default
systemctl enable sonde && systemctl is-enabled sondeCreated symlink /etc/systemd/system/multi-user.target.wants/sonde.service → /etc/systemd/system/sonde.service. enabled
systemctl enable sonde && systemctl is-enabled sondeCreated symlink /etc/systemd/system/multi-user.target.wants/sonde.service → /etc/systemd/system/sonde.service. enabled
systemctl enable sonde && systemctl is-enabled sondeCreated symlink /etc/systemd/system/multi-user.target.wants/sonde.service → /etc/systemd/system/sonde.service. enabled
systemctl enable sonde && systemctl is-enabled sondeCreated symlink /etc/systemd/system/multi-user.target.wants/sonde.service → /etc/systemd/system/sonde.service. enabled
rc-update add sonde default* service sonde added to runlevel default
6Le redémarrage automatique
Restart=always (supervise-daemon sur Alpine) relance le service quand son processus disparaît, plantage ou kill. Pour le voir, tuez le processus par son nom, attendez le délai de relance et regardez : nouveau PID, compteur de redémarrages à 1.
pkill sonde.sh; sleep 6; systemctl show -p MainPID -p NRestarts sondeMainPID=29655 NRestarts=1 (un autre PID que celui de systemctl status à l'étape 3)
pkill sonde.sh; sleep 6; systemctl show -p MainPID -p NRestarts sondeMainPID=29655 NRestarts=1 (un autre PID que celui de systemctl status à l'étape 3)
pkill sonde.sh; sleep 6; systemctl show -p MainPID -p NRestarts sondeMainPID=29655 NRestarts=1 (un autre PID que celui de systemctl status à l'étape 3)
pkill sonde.sh; sleep 6; systemctl show -p MainPID -p NRestarts sondeMainPID=29655 NRestarts=1 (un autre PID que celui de systemctl status à l'étape 3)
pkill sonde.sh; sleep 4; rc-status | grep sondesonde [ started 00:00:02 (1) ] (reparti depuis 2 secondes, relancé 1 fois)
journalctl -u sonde -n 5Sep 17 18:26:57 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.10 0.12 Sep 17 18:27:06 serveur systemd[1]:sonde.service: Deactivated successfully. Sep 17 18:27:11 serveur systemd[1]:sonde.service: Scheduled restart job, restart counter is at 1. Sep 17 18:27:11 serveur systemd[1]:Started sonde.service - Sonde de demonstration. Sep 17 18:27:11 serveur sonde.sh[29655]: sonde vivante, charge : 0.00 0.09 0.11
journalctl -u sonde -n 5Sep 17 18:26:57 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.10 0.12 Sep 17 18:27:06 serveur systemd[1]:sonde.service: Deactivated successfully. Sep 17 18:27:11 serveur systemd[1]:sonde.service: Scheduled restart job, restart counter is at 1. Sep 17 18:27:11 serveur systemd[1]:Started sonde.service - Sonde de demonstration. Sep 17 18:27:11 serveur sonde.sh[29655]: sonde vivante, charge : 0.00 0.09 0.11
journalctl -u sonde -n 5Sep 17 18:26:57 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.10 0.12 Sep 17 18:27:06 serveur systemd[1]:sonde.service: Deactivated successfully. Sep 17 18:27:11 serveur systemd[1]:sonde.service: Scheduled restart job, restart counter is at 1. Sep 17 18:27:11 serveur systemd[1]:Started sonde.service - Sonde de demonstration. Sep 17 18:27:11 serveur sonde.sh[29655]: sonde vivante, charge : 0.00 0.09 0.11
journalctl -u sonde -n 5Sep 17 18:26:57 serveur sonde.sh[29583]: sonde vivante, charge : 0.00 0.10 0.12 Sep 17 18:27:06 serveur systemd[1]:sonde.service: Deactivated successfully. Sep 17 18:27:11 serveur systemd[1]:sonde.service: Scheduled restart job, restart counter is at 1. Sep 17 18:27:11 serveur systemd[1]:Started sonde.service - Sonde de demonstration. Sep 17 18:27:11 serveur sonde.sh[29655]: sonde vivante, charge : 0.00 0.09 0.11
grep sonde /var/log/messages | tail -n 3Sep 17 18:27:12 serveur daemon.warn supervise-daemon[3888]: /usr/local/bin/sonde.sh, pid 3889, terminated by signal 15 Sep 17 18:27:14 serveur daemon.info supervise-daemon[3943]: Child command line: /usr/local/bin/sonde.sh Sep 17 18:27:14 serveur user.notice sonde: sonde vivante, charge : 0.00 0.00 0.00
7Une tâche planifiée : sauvegarder /etc chaque nuit
Un timer systemd lance un service à heure fixe, comme cron. Le service est de type oneshot (il fait son travail et s'arrête) ; le timer le déclenche chaque nuit à 3 h, et Persistent=true rattrape un passage manqué si la machine était éteinte. C'est le timer qu'on active, pas le service.
Un timer systemd lance un service à heure fixe, comme cron. Le service est de type oneshot (il fait son travail et s'arrête) ; le timer le déclenche chaque nuit à 3 h, et Persistent=true rattrape un passage manqué si la machine était éteinte. C'est le timer qu'on active, pas le service.
Un timer systemd lance un service à heure fixe, comme cron. Le service est de type oneshot (il fait son travail et s'arrête) ; le timer le déclenche chaque nuit à 3 h, et Persistent=true rattrape un passage manqué si la machine était éteinte. C'est le timer qu'on active, pas le service.
Un timer systemd lance un service à heure fixe, comme cron. Le service est de type oneshot (il fait son travail et s'arrête) ; le timer le déclenche chaque nuit à 3 h, et Persistent=true rattrape un passage manqué si la machine était éteinte. C'est le timer qu'on active, pas le service.
Ici, c'est cron qui planifie : une ligne dans la table de root, et crond démarré (il est installé mais arrêté). Le détail est dans le tutoriel Configurer les tâches cron.
mkdir -p /var/sauvegardes
cat > /etc/systemd/system/sauvegarde.service << 'EOF'
[Unit]
Description=Sauvegarde de /etc
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'tar czf /var/sauvegardes/etc-$(date +%%F).tar.gz -C / etc'
EOF
cat > /etc/systemd/system/sauvegarde.timer << 'EOF'
[Unit]
Description=Sauvegarde de /etc chaque nuit
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
systemctl daemon-reload
systemctl enable --now sauvegarde.timerCreated symlink /etc/systemd/system/timers.target.wants/sauvegarde.timer → /etc/systemd/system/sauvegarde.timer.
mkdir -p /var/sauvegardes
cat > /etc/systemd/system/sauvegarde.service << 'EOF'
[Unit]
Description=Sauvegarde de /etc
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'tar czf /var/sauvegardes/etc-$(date +%%F).tar.gz -C / etc'
EOF
cat > /etc/systemd/system/sauvegarde.timer << 'EOF'
[Unit]
Description=Sauvegarde de /etc chaque nuit
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
systemctl daemon-reload
systemctl enable --now sauvegarde.timerCreated symlink /etc/systemd/system/timers.target.wants/sauvegarde.timer → /etc/systemd/system/sauvegarde.timer.
mkdir -p /var/sauvegardes
cat > /etc/systemd/system/sauvegarde.service << 'EOF'
[Unit]
Description=Sauvegarde de /etc
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'tar czf /var/sauvegardes/etc-$(date +%%F).tar.gz -C / etc'
EOF
cat > /etc/systemd/system/sauvegarde.timer << 'EOF'
[Unit]
Description=Sauvegarde de /etc chaque nuit
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
systemctl daemon-reload
systemctl enable --now sauvegarde.timerCreated symlink /etc/systemd/system/timers.target.wants/sauvegarde.timer → /etc/systemd/system/sauvegarde.timer.
mkdir -p /var/sauvegardes
cat > /etc/systemd/system/sauvegarde.service << 'EOF'
[Unit]
Description=Sauvegarde de /etc
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'tar czf /var/sauvegardes/etc-$(date +%%F).tar.gz -C / etc'
EOF
cat > /etc/systemd/system/sauvegarde.timer << 'EOF'
[Unit]
Description=Sauvegarde de /etc chaque nuit
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
systemctl daemon-reload
systemctl enable --now sauvegarde.timerCreated symlink /etc/systemd/system/timers.target.wants/sauvegarde.timer → /etc/systemd/system/sauvegarde.timer.
mkdir -p /var/sauvegardes
echo '0 3 * * * tar czf /var/sauvegardes/etc-$(date +\%F).tar.gz -C / etc' >> /etc/crontabs/root
rc-update add crond default
rc-service crond start* service crond added to runlevel default * Starting busybox crond ... [ ok ]
systemctl list-timers sauvegarde.timerNEXT LEFT LAST PASSED UNIT ACTIVATES Fri 2026-09-18 03:00:00 UTC 8h - - sauvegarde.timer sauvegarde.service 1 timers listed.
systemctl list-timers sauvegarde.timerNEXT LEFT LAST PASSED UNIT ACTIVATES Fri 2026-09-18 03:00:00 UTC 8h - - sauvegarde.timer sauvegarde.service 1 timers listed.
systemctl list-timers sauvegarde.timerNEXT LEFT LAST PASSED UNIT ACTIVATES Fri 2026-09-18 03:00:00 UTC 8h - - sauvegarde.timer sauvegarde.service 1 timers listed.
systemctl list-timers sauvegarde.timerNEXT LEFT LAST PASSED UNIT ACTIVATES Fri 2026-09-18 03:00:00 UTC 8h - - sauvegarde.timer sauvegarde.service 1 timers listed.
crontab -l | tail -n 10 3 * * * tar czf /var/sauvegardes/etc-$(date +\%F).tar.gz -C / etc
systemctl start sauvegarde.service && ls -l /var/sauvegardes/total 564 -rw-r--r-- 1 root root 574668 Sep 17 18:27 etc-2026-09-17.tar.gz
systemctl start sauvegarde.service && ls -l /var/sauvegardes/total 564 -rw-r--r-- 1 root root 574668 Sep 17 18:27 etc-2026-09-17.tar.gz
systemctl start sauvegarde.service && ls -l /var/sauvegardes/total 564 -rw-r--r-- 1 root root 574668 Sep 17 18:27 etc-2026-09-17.tar.gz
systemctl start sauvegarde.service && ls -l /var/sauvegardes/total 564 -rw-r--r-- 1 root root 574668 Sep 17 18:27 etc-2026-09-17.tar.gz
tar czf /var/sauvegardes/etc-$(date +%F).tar.gz -C / etc && ls -l /var/sauvegardes/total 237 -rw-r--r-- 1 root root 242289 Sep 17 18:24 etc-2026-09-17.tar.gz
8Quand un service ne démarre pas
Deux pannes provoquées, pour reconnaître leurs symptômes. La première : la commande lancée par le service (ExecStart, ou command sur Alpine) n'existe pas, faute de frappe, fichier déplacé ou droit d'exécution absent.
sed -i 's#ExecStart=/usr/local/bin/sonde.sh#ExecStart=/usr/local/bin/sonde-absente.sh#' /etc/systemd/system/sonde.service
systemctl daemon-reload
systemctl restart sondesed -i 's#ExecStart=/usr/local/bin/sonde.sh#ExecStart=/usr/local/bin/sonde-absente.sh#' /etc/systemd/system/sonde.service
systemctl daemon-reload
systemctl restart sondesed -i 's#ExecStart=/usr/local/bin/sonde.sh#ExecStart=/usr/local/bin/sonde-absente.sh#' /etc/systemd/system/sonde.service
systemctl daemon-reload
systemctl restart sondesed -i 's#ExecStart=/usr/local/bin/sonde.sh#ExecStart=/usr/local/bin/sonde-absente.sh#' /etc/systemd/system/sonde.service
systemctl daemon-reload
systemctl restart sondesed -i 's#command="/usr/local/bin/sonde.sh"#command="/usr/local/bin/sonde-absente.sh"#' /etc/init.d/sonde
rc-service sonde restart* Stopping sonde ... [ ok ] * Starting sonde ... * supervise-daemon: /usr/local/bin/sonde-absente.sh does not exist * failed to start sonde * ERROR: sonde failed to start
systemctl status sonde● sonde.service - Sonde de demonstration
Loaded: loaded (/etc/systemd/system/sonde.service; enabled; preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Thu 2026-09-17 18:19:12 UTC; 1s ago
Process: 29019 ExecStart=/usr/local/bin/sonde-absente.sh (code=exited, status=203/EXEC)
Main PID: 29019 (code=exited, status=203/EXEC)systemctl status sonde● sonde.service - Sonde de demonstration
Loaded: loaded (/etc/systemd/system/sonde.service; enabled; preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Thu 2026-09-17 18:19:12 UTC; 1s ago
Process: 29019 ExecStart=/usr/local/bin/sonde-absente.sh (code=exited, status=203/EXEC)
Main PID: 29019 (code=exited, status=203/EXEC)systemctl status sonde● sonde.service - Sonde de demonstration
Loaded: loaded (/etc/systemd/system/sonde.service; enabled; preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Thu 2026-09-17 18:19:12 UTC; 1s ago
Process: 29019 ExecStart=/usr/local/bin/sonde-absente.sh (code=exited, status=203/EXEC)
Main PID: 29019 (code=exited, status=203/EXEC)systemctl status sonde● sonde.service - Sonde de demonstration
Loaded: loaded (/etc/systemd/system/sonde.service; enabled; preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Thu 2026-09-17 18:19:12 UTC; 1s ago
Process: 29019 ExecStart=/usr/local/bin/sonde-absente.sh (code=exited, status=203/EXEC)
Main PID: 29019 (code=exited, status=203/EXEC)journalctl -u sonde -n 10Sep 17 18:19:07 serveur systemd[1]:sonde.service: Scheduled restart job, restart counter is at 1. Sep 17 18:19:07 serveur systemd[1]:Started sonde.service - Sonde de demonstration. Sep 17 18:19:07 serveur systemd[1]:sonde.service: Main process exited, code=exited, status=203/EXEC Sep 17 18:19:07 serveur systemd[1]:sonde.service: Failed with result 'exit-code'. Sep 17 18:19:12 serveur systemd[1]:sonde.service: Scheduled restart job, restart counter is at 2. ...
journalctl -u sonde -n 10Sep 17 18:19:07 serveur systemd[1]:sonde.service: Scheduled restart job, restart counter is at 1. Sep 17 18:19:07 serveur systemd[1]:Started sonde.service - Sonde de demonstration. Sep 17 18:19:07 serveur systemd[1]:sonde.service: Main process exited, code=exited, status=203/EXEC Sep 17 18:19:07 serveur systemd[1]:sonde.service: Failed with result 'exit-code'. Sep 17 18:19:12 serveur systemd[1]:sonde.service: Scheduled restart job, restart counter is at 2. ...
journalctl -u sonde -n 10Sep 17 18:19:07 serveur systemd[1]:sonde.service: Scheduled restart job, restart counter is at 1. Sep 17 18:19:07 serveur systemd[1]:Started sonde.service - Sonde de demonstration. Sep 17 18:19:07 serveur systemd[1]:sonde.service: Main process exited, code=exited, status=203/EXEC Sep 17 18:19:07 serveur systemd[1]:sonde.service: Failed with result 'exit-code'. Sep 17 18:19:12 serveur systemd[1]:sonde.service: Scheduled restart job, restart counter is at 2. ...
journalctl -u sonde -n 10Sep 17 18:19:07 serveur systemd[1]:sonde.service: Scheduled restart job, restart counter is at 1. Sep 17 18:19:07 serveur systemd[1]:Started sonde.service - Sonde de demonstration. Sep 17 18:19:07 serveur systemd[1]:sonde.service: Main process exited, code=exited, status=203/EXEC Sep 17 18:19:07 serveur systemd[1]:sonde.service: Failed with result 'exit-code'. Sep 17 18:19:12 serveur systemd[1]:sonde.service: Scheduled restart job, restart counter is at 2. ...
« activating (auto-restart) » : le service tombe et systemd le relance en boucle toutes les 5 secondes (Restart=always). « status=203/EXEC » : systemd n'a pas pu exécuter la commande, elle n'existe pas ou n'est pas exécutable. Un « status=1/FAILURE » voudrait dire que le programme s'est lancé puis a échoué : ses propres messages sont alors juste au-dessus dans le journal.
« activating (auto-restart) » : le service tombe et systemd le relance en boucle toutes les 5 secondes (Restart=always). « status=203/EXEC » : systemd n'a pas pu exécuter la commande, elle n'existe pas ou n'est pas exécutable. Un « status=1/FAILURE » voudrait dire que le programme s'est lancé puis a échoué : ses propres messages sont alors juste au-dessus dans le journal.
« activating (auto-restart) » : le service tombe et systemd le relance en boucle toutes les 5 secondes (Restart=always). « status=203/EXEC » : systemd n'a pas pu exécuter la commande, elle n'existe pas ou n'est pas exécutable. Un « status=1/FAILURE » voudrait dire que le programme s'est lancé puis a échoué : ses propres messages sont alors juste au-dessus dans le journal.
« activating (auto-restart) » : le service tombe et systemd le relance en boucle toutes les 5 secondes (Restart=always). « status=203/EXEC » : systemd n'a pas pu exécuter la commande, elle n'existe pas ou n'est pas exécutable. Un « status=1/FAILURE » voudrait dire que le programme s'est lancé puis a échoué : ses propres messages sont alors juste au-dessus dans le journal.
OpenRC le dit tout de suite : supervise-daemon ne trouve pas la commande et le service reste stopped. Les mêmes lignes sont dans /var/log/messages (grep sonde).
sed -i 's#ExecStart=/usr/local/bin/sonde-absente.sh#ExecStart=/usr/local/bin/sonde.sh#' /etc/systemd/system/sonde.service
systemctl daemon-reload
systemctl restart sonde
systemctl is-active sondeactive
sed -i 's#ExecStart=/usr/local/bin/sonde-absente.sh#ExecStart=/usr/local/bin/sonde.sh#' /etc/systemd/system/sonde.service
systemctl daemon-reload
systemctl restart sonde
systemctl is-active sondeactive
sed -i 's#ExecStart=/usr/local/bin/sonde-absente.sh#ExecStart=/usr/local/bin/sonde.sh#' /etc/systemd/system/sonde.service
systemctl daemon-reload
systemctl restart sonde
systemctl is-active sondeactive
sed -i 's#ExecStart=/usr/local/bin/sonde-absente.sh#ExecStart=/usr/local/bin/sonde.sh#' /etc/systemd/system/sonde.service
systemctl daemon-reload
systemctl restart sonde
systemctl is-active sondeactive
sed -i 's#command="/usr/local/bin/sonde-absente.sh"#command="/usr/local/bin/sonde.sh"#' /etc/init.d/sonde
rc-service sonde restart* Starting sonde ... [ ok ]
Seconde panne, la plus fréquente : modifier le fichier du service et redémarrer sans daemon-reload. systemd prévient, mais garde l'ancienne version chargée.
Seconde panne, la plus fréquente : modifier le fichier du service et redémarrer sans daemon-reload. systemd prévient, mais garde l'ancienne version chargée.
Seconde panne, la plus fréquente : modifier le fichier du service et redémarrer sans daemon-reload. systemd prévient, mais garde l'ancienne version chargée.
Seconde panne, la plus fréquente : modifier le fichier du service et redémarrer sans daemon-reload. systemd prévient, mais garde l'ancienne version chargée.
sed -i 's/RestartSec=5/RestartSec=3/' /etc/systemd/system/sonde.service && systemctl restart sondeWarning: The unit file, source configuration file or drop-ins of sonde.service changed on disk. Run 'systemctl daemon-reload' to reload units.
sed -i 's/RestartSec=5/RestartSec=3/' /etc/systemd/system/sonde.service && systemctl restart sondeWarning: The unit file, source configuration file or drop-ins of sonde.service changed on disk. Run 'systemctl daemon-reload' to reload units.
sed -i 's/RestartSec=5/RestartSec=3/' /etc/systemd/system/sonde.service && systemctl restart sondeWarning: The unit file, source configuration file or drop-ins of sonde.service changed on disk. Run 'systemctl daemon-reload' to reload units.
sed -i 's/RestartSec=5/RestartSec=3/' /etc/systemd/system/sonde.service && systemctl restart sondeWarning: The unit file, source configuration file or drop-ins of sonde.service changed on disk. Run 'systemctl daemon-reload' to reload units.
systemctl show -p RestartUSec sondeRestartUSec=5s
systemctl show -p RestartUSec sondeRestartUSec=5s
systemctl show -p RestartUSec sondeRestartUSec=5s
systemctl show -p RestartUSec sondeRestartUSec=5s
systemctl daemon-reload && systemctl restart sonde && systemctl show -p RestartUSec sondeRestartUSec=3s
systemctl daemon-reload && systemctl restart sonde && systemctl show -p RestartUSec sondeRestartUSec=3s
systemctl daemon-reload && systemctl restart sonde && systemctl show -p RestartUSec sondeRestartUSec=3s
systemctl daemon-reload && systemctl restart sonde && systemctl show -p RestartUSec sondeRestartUSec=3s
Sur Alpine, OpenRC relit le script à chaque commande : pas de daemon-reload. Une autre erreur classique y prend sa place : un script /etc/init.d sans droit d'exécution, refusé avec « Failed executing '/etc/init.d/sonde': Permission denied » (chmod +x le règle).
Les commandes du quotidien
nom est le nom du service, sans le suffixe .service (systemctl le complète).
nom est le nom du service, sans le suffixe .service (systemctl le complète).
nom est le nom du service, sans le suffixe .service (systemctl le complète).
nom est le nom du service, sans le suffixe .service (systemctl le complète).
nom est le nom du script dans /etc/init.d.
systemctl status nomsystemctl list-units --type=servicesystemctl --failedsystemctl cat nomsystemctl daemon-reloadsystemctl list-timerssystemctl list-dependencies nomjournalctl -u nom -fjournalctl -p err -bjournalctl --disk-usagesystemd-analyze blamesystemctl status nomsystemctl list-units --type=servicesystemctl --failedsystemctl cat nomsystemctl daemon-reloadsystemctl list-timerssystemctl list-dependencies nomjournalctl -u nom -fjournalctl -p err -bjournalctl --disk-usagesystemd-analyze blamesystemctl status nomsystemctl list-units --type=servicesystemctl --failedsystemctl cat nomsystemctl daemon-reloadsystemctl list-timerssystemctl list-dependencies nomjournalctl -u nom -fjournalctl -p err -bjournalctl --disk-usagesystemd-analyze blamesystemctl status nomsystemctl list-units --type=servicesystemctl --failedsystemctl cat nomsystemctl daemon-reloadsystemctl list-timerssystemctl list-dependencies nomjournalctl -u nom -fjournalctl -p err -bjournalctl --disk-usagesystemd-analyze blamerc-service nom statusrc-statusrc-status --servicelistrc-update showrc-update add nom defaultrc-update del nomtail -f /var/log/messagesgrep 'nom:' /var/log/messagesLes services sous contrôle
Vous savez lire l'état d'un service, créer le vôtre, suivre son journal, le faire revenir après un plantage et planifier une tâche. La suite naturelle : Configurer les tâches cron pour les planifications plus fines, et Installer Nginx avec PHP-FPM pour un vrai service à gérer.
Erreurs fréquentes
L'image du serveur a été construite sur un autre disque et GRUB demande où se réinstaller : choisissez le disque de la machine (celui que lsblk affiche, en général /dev/sda) ; la mise à jour continue ensuite.
Le fichier n'est pas dans /etc/systemd/system, ne se termine pas par .service, ou systemd ne l'a pas encore lu : systemctl daemon-reload, puis vérifiez le nom avec ls /etc/systemd/system.
Le fichier n'a pas de section [Install] : ajoutez [Install] et WantedBy=multi-user.target (étape 3), daemon-reload, puis enable.
Vous avez modifié le fichier sans le faire relire : systemctl daemon-reload, puis systemctl restart. Tant que ce n'est pas fait, l'ancienne version reste chargée (étape 8).
Le service tombe et systemd le relance en boucle. journalctl -u nom -n 20 montre pourquoi : status=203/EXEC, la commande n'existe pas ou n'est pas exécutable ; un autre code, le programme lui-même a échoué et ses messages précèdent cette ligne.
Ubuntu 24.04 lance sshd à la demande par ssh.socket : le service ne tourne qu'entre l'arrivée d'une connexion et sa fin. C'est ssh.socket qui doit être actif (systemctl status ssh.socket).
Le fichier du service porte User=nobody : remplacez-le par DynamicUser=yes (étape 3) ou par un utilisateur créé pour le service, puis daemon-reload et restart.
Le script n'est pas exécutable : chmod +x /etc/init.d/sonde.
Le programme échoue dès le lancement et supervise-daemon renonce après 5 essais. La cause est juste au-dessus dans /var/log/messages (par exemple un fichier que command_user ne peut pas écrire) ; corrigez, puis rc-service sonde restart.