Linux System Tools

Quelques commandes que j’utilise tous les jours pour comprendre ce qui se passe sur un serveur Linux : qui ouvre quoi (lsof), qui a lancé quoi (pstree), qui s’est connecté (last), comment trier et filtrer une sortie (sort, grep) et comment piloter les services (systemctl, journalctl). Les commandes et options ont été vérifiées sous Debian 13.

lsof : lister les fichiers ouverts

lsof signifie « LiSt Open Files ». Il indique quels fichiers sont ouverts, et par quels processus. Sous Linux, presque tout est un fichier : fichiers ordinaires, répertoires, périphériques, tubes (pipes), sockets réseau et sockets Unix. lsof permet donc de répondre à des questions très variées.

Lancez-le en root pour voir les fichiers de tous les utilisateurs. Les options -n (pas de résolution DNS) et -P (numéros de port au lieu des noms) accélèrent nettement l’affichage.

apt install lsof

Par fichier, répertoire ou périphérique

lsof | less

Liste tous les fichiers ouverts. La liste est longue, d’où le less.

lsof /var/log/apache2/access.log

Processus qui utilisent ce fichier.

lsof +D /var/log

Fichiers ouverts dans ce répertoire et ses sous-répertoires. Pratique quand un umount répond « target is busy ».

lsof /dev/sda1

Fichiers ouverts sur ce périphérique (ou sur le système de fichiers qu’il porte).

lsof /dev/tty1

Processus attachés au terminal tty1.

Par utilisateur ou par commande

lsof -u root

Fichiers ouverts par les processus de l’utilisateur root.

lsof -u ^root

Fichiers ouverts par tous les processus qui n’appartiennent pas à root.

lsof -c nginx

Fichiers ouverts par les processus dont le nom commence par nginx.

lsof -t -u ansible

L’option -t n’affiche que les PID, ce qui permet de les passer à une autre commande. Par exemple, pour arrêter tous les processus de l’utilisateur ansible :

kill $(lsof -t -u ansible)

Commencez par un kill simple (signal TERM), qui laisse aux programmes le temps de se fermer proprement. Ne passez à kill -9 que pour les processus qui refusent de s’arrêter.

Combiner les critères : OU ou ET

Par défaut, les critères de sélection se combinent en OU : la commande suivante liste les fichiers de root et ceux de toutes les commandes bash, quel que soit leur propriétaire.

lsof -u root -c bash

L’option -a les combine en ET : ici, uniquement les processus bash appartenant à root.

lsof -a -u root -c bash

Fichiers supprimés mais encore ouverts

Si l’on supprime un fichier qu’un processus garde ouvert (un gros fichier de log, typiquement), l’espace disque n’est pas libéré tant que le processus ne l’a pas fermé. df indique alors un disque plein alors que du ne trouve rien. Pour retrouver ces fichiers et le processus qui les tient :

lsof +L1

+L1 sélectionne les fichiers ouverts dont le nombre de liens est inférieur à 1, c’est-à-dire supprimés. Redémarrer le service concerné (ou lui faire rouvrir ses logs) libère l’espace.

Réseau

lsof -i -n -P

Tous les fichiers réseau (sockets TCP et UDP).

lsof -i 4
lsof -i 6

Uniquement IPv4, ou uniquement IPv6.

lsof -i TCP:80 -n -P

Processus qui utilisent le port TCP 80, en écoute ou connectés.

lsof -i TCP:1-1024 -n -P

Processus sur les ports TCP 1 à 1024 (les ports « privilégiés »).

lsof -i TCP -s TCP:LISTEN -n -P

Uniquement les sockets TCP en écoute.

lsof -i@10.0.10.19 -n -P

Connexions avec l’adresse IP 10.0.10.19.

lsof -U

Sockets Unix (communication locale entre processus).

Pour une vue réseau rapide, ss -tulpn (paquet iproute2) donne aussi les ports en écoute et les processus associés.

pstree : l’arbre des processus

pstree affiche les processus sous forme d’arbre, ce qui montre immédiatement qui a lancé quoi. Il fait partie du paquet psmisc, qui n’est pas toujours installé par défaut :

apt install psmisc
pstree -p

Arbre complet avec les PID.

pstree -a

Affiche aussi les arguments de chaque commande.

pstree -u

Signale les changements d’utilisateur (un processus root qui lance un processus www-data, par exemple).

pstree -p -s 1234

Remonte la lignée du processus 1234 jusqu’à systemd : utile pour savoir d’où vient un processus inconnu.

pstree www-data

Uniquement les processus d’un utilisateur.

last : l’historique des connexions

last liste les dernières ouvertures de session et les redémarrages.

last
last -n 10
last amgv
last reboot

Respectivement : tout l’historique, les 10 dernières entrées, les sessions d’un utilisateur, et les redémarrages.

last -F
last -x
last -s "2026-09-01 00:00:00" -t "2026-09-30 23:59:59"

Dates complètes, arrêts du système inclus, et filtre sur une période.

À savoir sous Debian 13 : last est désormais fourni par le paquet wtmpdb, qui enregistre les sessions dans une base SQLite au lieu de l’ancien fichier /var/log/wtmp. Les options courantes restent les mêmes, mais lastb (tentatives de connexion échouées) n’existe plus. Pour ces échecs, consultez le journal :

journalctl -u ssh --since today | grep -i "failed"

sort : trier une sortie

sort fichier.txt
sort -r fichier.txt
sort -u fichier.txt

Tri alphabétique, tri inverse, tri en supprimant les doublons.

sort -n nombres.txt

Tri numérique (sinon 10 arrive avant 9).

du -sh /var/* | sort -h

Tri de tailles « humaines » (K, M, G) : trouve les plus gros répertoires.

sort -t: -k3 -n /etc/passwd

Tri sur un champ : -t: définit le séparateur, -k3 le 3e champ (ici l’UID).

cut -d' ' -f1 /var/log/nginx/access.log | sort | uniq -c | sort -rn | head

Combinaison classique : les 10 adresses IP les plus fréquentes dans un journal d’accès. uniq -c compte les lignes identiques consécutives, d’où le premier sort.

grep : chercher dans des fichiers

grep "error" /var/log/apache2/error.log
grep -i "error" /var/log/apache2/error.log

Recherche simple, puis insensible à la casse. grep fonctionne aussi en sortie d’une autre commande, par exemple journalctl -b | grep -i error pour les journaux système.

grep -n "Listen" /etc/apache2/ports.conf
grep -c "/bin/bash" /etc/passwd

Affiche les numéros de ligne, ou seulement le nombre de lignes trouvées (ici, les comptes dont le shell est bash).

grep -rn "PermitRootLogin" /etc/ssh/
grep -rl "192.168.31.5" /etc/

Recherche récursive dans un répertoire, avec numéros de ligne, ou en listant seulement les fichiers concernés.

grep -rn --include="*.conf" "ServerName" /etc/apache2/

Recherche limitée à certains types de fichiers.

grep -w "root" /etc/passwd

Mot entier uniquement (root, mais pas chroot).

journalctl -k | grep -A3 -B2 "Out of memory"

Affiche 3 lignes après et 2 lignes avant chaque résultat (-C3 pour 3 lignes de part et d’autre).

grep -Ev '^\s*(#|$)' /etc/ssh/sshd_config

Affiche un fichier de configuration sans les commentaires ni les lignes vides. -v inverse la sélection, -E active les expressions régulières étendues.

ps aux | grep "[n]ginx"

Astuce : les crochets empêchent grep de se trouver lui-même dans la liste des processus.

systemctl et journalctl : gérer les services

État et contrôle

systemctl status nginx
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
systemctl reload nginx

reload relit la configuration sans couper le service, quand celui-ci le permet ; restart l’arrête puis le relance.

systemctl enable --now nginx
systemctl disable --now nginx

Active (ou désactive) le démarrage automatique et démarre (ou arrête) le service dans la même commande.

systemctl is-active nginx
systemctl is-enabled nginx

Réponses courtes (active, enabled…), utiles dans un script.

Inventaire

systemctl --failed
systemctl list-units --type=service --state=running
systemctl list-unit-files --state=enabled
systemctl list-timers

Services en échec, services en cours d’exécution, services activés au démarrage, et tâches planifiées par des timers systemd.

Configuration des unités

systemctl cat nginx

Affiche le fichier d’unité et ses éventuelles surcharges.

SYSTEMD_EDITOR=vi systemctl edit nginx

Crée une surcharge (override.conf) sans toucher au fichier fourni par le paquet, qui serait écrasé à la prochaine mise à jour. La variable SYSTEMD_EDITOR choisit l’éditeur.

systemctl daemon-reload

À lancer après avoir modifié ou créé un fichier d’unité à la main.

systemctl mask nginx
systemctl unmask nginx

mask empêche totalement le démarrage du service, même manuel ou comme dépendance d’un autre service.

Journaux

journalctl -u nginx
journalctl -u nginx -f
journalctl -u nginx --since "1 hour ago"
journalctl -b -p err
journalctl --disk-usage

Journaux d’un service, en suivi continu (comme tail -f), sur la dernière heure, erreurs depuis le dernier démarrage, et place occupée par les journaux.

Commentaires

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. Découvrez comment les données de vos commentaires sont traitées.