Commandes
|
# Démarrer une unité
sudo systemctl start <unit>
# Arrêter une unité
sudo systemctl stop <unit>
# Redémarrer une unité
sudo systemctl restart <unit>
# Inclure un service au démarrage
sudo systemctl enable <service_name>
# Retirer un service du démarrage
sudo systemctl disable <service_name>
# tester si un service va être lancé au démarrage
systemctl is-enabled <service_name>
# test si un service fonctionne
systemctl is-active <service_name>
if (systemctl is-active --quiet <service_name>); then
sudo systemctl start <service_name>
fi
|
|
# Lister les unités en fonctionnement
systemctl
# Lister les unités qui ont échouées
systemctl --failed
# Liste les unités installées, et indique celles qui sont chargées
systemctl list-unit-files
# Les fichiers des unités sont dans /usr/lib/systemd/system/ et /etc/systemd/system/
# filter avec | grep enabled
# Tester l'état d'un service
systemctl status <service_name>
# Afficher le contenu du fichier chargé pour un service donné
systemctl cat <service_name>
# Afficher le dépendances
systemctl list-dependencies <service_name>
# lancer directement le service en debug
SYSTEMD_LOG_LEVEL=debug /lib/systemd/<service_name>
|
Arrêt du système
|
# arrêt de la machine
systemctl poweroff
# redémarrer
systemctl reboot
# mise en veille
systemctl suspend
# hibernation
systemctl hibernate
# combinaison de la mise en veille et de l'hibernation
systemctl hybrid-sleep
|
|
Les utilisateurs d'une session locale peuvent utiliser des commandes lié à l'arrêt du système sans sudo grâce à polkit Allow Users to Shutdown |
/usr/lib/systemd/system |
units provided by installed packages
|
/etc/systemd/system |
units installed by the system administrator
|
Type
simple |
si le processus configuré dans ExecStart est le processus principal du service.
|
forking |
si le processus configuré dans ExecStart va faire appel à fork(). Le processus parent se terminera à la fin du démarrage du service. Le processus fils devient le processus principal.
|
oneshot |
équivalent à simple, toutefois le processus principal doit se terminer avant que systemd ne démarre les unités suivantes. Possibilité d'utiliser RemainAfterExit.
|
dbus |
équivalent à simple, toutefois le service obtient un nom sur D-Bus tel que configuré dans BusName.
|
notify |
équivalent à simple, toutefois le service envoie une notification à la fin du démarrage.
|
idle |
équivalent à simple, toutefois l’exécution du service est retardé jusqu'à la répartition de tous les active jobs.
|
Optimisation
|
# temps de démarrage
systemd-analyze
# graphique des temps de chargement
systemd-analyze plot > plot.svg; firefox plot.svg
|
|
systemctl enable myunit.timer
systemctl start myunit.timer
systemctl is-enabled myunit.timer
systemctl is-active myunit.timer
systemctl list-timers
systemctl --user list-timers
|
/etc/systemd/system/myunit.timer
|
[Unit]
Description=Run foo weekly
# Monotonic timer: se déclenche 15mn après le démarrage puis toutes les semaines
[Timer]
OnBootSec=15min
OnUnitActiveSec=1w
# Realtime timer: se déclenche toutes les semaines
[Timer]
OnCalendar=weekly
Persistent=true
[Install]
WantedBy=timers.target
|
/etc/systemd/system/myunit.service
|
[Unit]
Description=...
[Service]
Type=oneshot
# systemd still considers the service as active after the process has exited
RemainAfterExit=yes
ExecStart=...
ExecStart=...
ExecStartPost=...
|
~/.config/systemd/user/myunit.service
|
|
|
systemctl --user start myunit
|
|
# affiche tous les messages depuis le boot
journalctl -b
# affiche tous les messages de l'avant dernier boot
journalctl -b -1
# list the known boots
journalctl --list-boots
# display messages from today
journalctl --since today
# 10 minutes ago
journalctl --since "10 minutes ago"
# between 2 dates
journalctl --since "2021-01-30" --until "2021-01-31 18:30"
# affiche les messages de l'unité logrotate
journalctl -u logrotate
# affiche les messages de priorités 4 (warning) et au-dessus
journalctl -p 4
# emerg (0), alert (1), crit (2), err (3), warning (4), notice(5), info (6), debug (7)
# affiche les messages concernant gdm
journalctl -b -p 5 --no-pager | grep gdm
# affiche les messages en temps réel
journalctl -f
# connaître la place prise par les logs
journalctl --disk-usage
# Retain the logs of the last 30 days
sudo journalctl --vacuum-time=30d
# Retain only the past 40 MB
journalctl --vacuum-size=40M
# coloration de l'affichage
journalctl -b | ccze -A | less
|
How To Use Journalctl to View and Manipulate Systemd Logs
Configuration
/etc/systemd/journald.conf
|
# Specifies the maximum disk space that can be used by the journal in persistent storage.
# par défaut 10% de la partition
SystemMaxUse=100M
# Specifies the maximum disk space that can be used in volatile storage (within the /run filesystem).
RuntimeMaxUse=100M
|
Compatibilité avec syslog
« journal » remplace « syslog » mais certain programmes (Postfix) continue à utiliser explicitement syslog et ont besoin que celui-ci soit installé et démarré pour pouvoir loguer dans des fichiers (sinon tous va dans le journal).
|
pacman -S syslog-ng
systemctl enable syslog-ng
|
|
systemd.unit=multi-user.target # Multi-user, non-graphical
|
Erreurs
Failed to get D-Bus connection: No connection to service manager.
systemd n'est pas chargé → Chargez systemd.
Migrer d'initscript vers systemd
Chargez systemd
|
# installez systemd-sysvcompat
sudo pacman systemd-sysvcompat
# ou au boot, éditer grub (e)
# et ajouter init=/bin/systemd
|
Redémarrez
(GDM ne devrait pas se lancer car systemd n'utilise pas /etc/inittab)
Remplacez les DAEMONS par les unités systemd
dbus et alsa sont chargés automatiquement.
systemd possède son propre mécanisme de journalisation, syslog n'est plus requis par défaut.
|
# Pour chaque daemon du fichier /etc/rc.conf,
# utilisez la commande suivant pour inclure le service au démarrage dans systemd
sudo systemctl enable <service_name>
# Exemples
# syslog-ng
sudo systemctl enable syslog-ng.service
# networkmanager
sudo systemctl enable NetworkManager.service
sudo systemctl enable NetworkManager-wait-online.service
# crond
sudo systemctl enable cronie.service
# cupsd
sudo systemctl enable cups.service
# mysqld
sudo systemctl enable mysqld.service
# httpd
sudo systemctl enable httpd.service
|
Équivalent systemd des daemons initscript
GDM
systemd n'utilise pas le fichier /etc/inittab.
|
sudo systemctl enable gdm.service
|