Lors d'un précédent article sur chkconfig, j'avais décrit comment activer les services sous Red Hat, avec les scripts init.d (à la mode SysV).
Depuis, la majorité des distributions GNU/Linux est passée sous systemd, qui apporte son lot de changement.
LA commande à connaître est maintenant systemctl. C'est elle qui permet de gérer la grande majorité des interactions au niveau administrateur.
La syntaxe est la suivante :
systemctl [OPTIONS} COMMANDE [SERVICE]
Activation / Désactivation d'un service au démarrage
On utilise les commandes enable ou disable, selon le cas
systemctl enable/disable SERVICE
Exemple :
# systemctl disable mysql.service Synchronizing state of mysql.service with SysV init with /lib/systemd/systemd-sysv-install... Executing /lib/systemd/systemd-sysv-install disable mysql insserv: warning: current start runlevel(s) (empty) of script `mysql' overrides LSB defaults (2 3 4 5). insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script `mysql' overrides LSB defaults (0 1 6).
Opérations de démarrage / arrêt / vérification
On utilise les commandes start / stop / status, pour une interaction directe avec le service :
systemctl start / stop / restart / status SERVICE
Exemple :
$ sudo systemctl start mysql
La commande ne donne généralement pas d'information en cas de succès.
On peut vérifier le statut du service :
$ sudo systemctl status mysql mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; disabled; vendor preset: enabled) Active: active (running) since jeu. 2016-12-08 09:02:28 CET; 19s ago Process: 4149 ExecStartPost=/usr/share/mysql/mysql-systemd-start post (code=exited, status=0/SUCCESS) Process: 4145 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS) Main PID: 4148 (mysqld) Tasks: 28 Memory: 165.8M CPU: 268ms CGroup: /system.slice/mysql.service └─4148 /usr/sbin/mysqld déc. 08 09:02:27 ARIS566 systemd[1]: Starting MySQL Community Server... déc. 08 09:02:28 ARIS566 systemd[1]: Started MySQL Community Server.
Lister les services déclarés
On utilise la commande list-unit-files. On peut filtrer sur l'état
systemctl list-unit-files [--state=disabled|enabled]
Après avoir modifié un fichier de déclaration de service, dans (/usr)/lib/systemd/system
ou /etc/ystemd/system
(pour les services "perso", il est recommandé de recharger la configuration, via la commande daemon-reload
systemctl daemon-reload
Fichiers de définition des services
A la différence des fichiers de démarrage sysV, qui reposaient sur un seul fichier dans /etc/init.d
, et des liens symboliques vers /etc/rc*.d
, on distingue maintenant la définition du service et les scripts de démarrage, arrêt, etc.
Les fichiers de définiition se trouvent dans /lib/system/system
(debian/ubuntu) ou /usr/lib/system (rhel, sles)
pour les paquets fournis par la distribution.
Pour des services personnalisés, il est recommandé de placer les fichiers dans le répertoire /etc/systemd/system.
Lorsqu'on active (enable) un service, on crée un lien symbolique dans le répertoire précisé par la section [Install] du fichier de configuration.
Exemple pour le service mysql :
[Install] WantedBy=multi-user.target
Par défaut losqu'on installe mysql, le service est activé. On peut le vérifier avec la commande status, dans les informations vendor preset (enabled) :
systemctl status mysql.service mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled) Active: inactive (dead)
On peut vérifier la présence d'un lien vers le répertoire cible ;
ls -l /etc/systemd/system/multi-user.target.wants/mysql.service lrwxrwxrwx 1 root root 33 déc. 7 16:46 /etc/systemd/system/multi-user.target.wants/mysql.service -> /lib/systemd/system/mysql.service
Au reboot de la machine, mysql sera donc relancé automatiquement.
Format d'un fichier de configuration
Le fichier de configuration a un format de fichier "ini" comprenant plusieurs sections :
- Unit : définiition du nom du service et de ses dépendances (Before / After)
- Install : niveau à utiliser lors de l'activation du service
- Service : définition des paramètres : scripts de lancement, arrêt, pre/post start, variables, etc
Exemple pour le service MySQL :
# MySQL systemd service file [Unit] Description=MySQL Community Server After=network.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql PermissionsStartOnly=true ExecStartPre=/usr/share/mysql/mysql-systemd-start pre ExecStart=/usr/sbin/mysqld ExecStartPost=/usr/share/mysql/mysql-systemd-start post TimeoutSec=600 Restart=on-failure RuntimeDirectory=mysqld RuntimeDirectoryMode=755
On distingue bien ici les scripts de démarrage et arrêt, ainsi que les paramètres de lancement (utilisateur, groupe, etc).
Fichier de configuration pour OpenDJ
En bonus, je fournis un exemple de fichier de configuration pour OpenDJ, un annuaire LDAP écrit en Java, qui offre la possibilité d'avoir plusieurs installations et donc plusieurs instances sur une machine, de manière simple.
Par défaut, le démarrage et l'arrêt de l'annuaire se font via les commandes bin/start-ds et bin/stop-ds du répertoire d'installation de OpenDJ. De ce fait, la configuration systemd est assez simple. En prenant l'hypothèse où l'annuaire est installé dans le répertoire /opt/opendj-idm :
# # Service definition for OpenDJ # [Unit] Description=A Java Directory Server After=network.target [Service] Type=forking PIDFile=/opt/opendj-idm/logs/server.pid ExecStart=/opt/opendj-idm/bin/start-ds ExecStop=/opt/opendj-idm/bin/stop-ds TimeoutStopSec=5 KillMode=mixed [Install] WantedBy=multi-user.target