La commande lsof expliquée aux utilisateurs de Mac

Maîtrisez la commande lsof pour découvrir quels processus ont des fichiers ouverts sur votre Mac. Un guide pour les développeurs et les utilisateurs avancés.

Votre disque externe refuse de s’éjecter. macOS vous sert le message exaspérant de flou selon lequel « un ou plusieurs programmes l’utilisent peut-être ». Quels programmes ? Il ne le dit pas. C’est là qu’intervient lsof.

Le nom signifie « list open files » (lister les fichiers ouverts), et c’est exactement ce qu’il fait. Sur les systèmes basés sur Unix comme macOS, presque tout est traité comme un fichier, y compris les connexions réseau, les périphériques et les volumes de disque. Lorsque vous ne pouvez pas éjecter un disque, lsof vous dit précisément quel processus le retient en otage.

Syntaxe de base

La manière la plus simple d’utiliser lsof pour les problèmes d’éjection est :

lsof /Volumes/YourDriveName

Remplacez « YourDriveName » par le nom réel de votre disque. Si le nom contient des espaces, mettez tout le chemin entre guillemets :

lsof "/Volumes/My Backup Drive"

Cela renvoie une liste de tous les processus ayant un descripteur de fichier ouvert sur ce volume. Chaque ligne affiche le nom du processus, son identifiant (PID), l’utilisateur qui l’exécute et des informations sur le fichier précis auquel on accède.

Lire la sortie

Une sortie typique de lsof ressemble à ceci :

COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mds_store  1234   root   4r   REG   1,12   524288  ...  /Volumes/External/.Spotlight-V100/...
Finder     5678   you    3r   DIR   1,12     1024  ...  /Volumes/External

Les colonnes les plus importantes sont COMMAND (le nom du processus), PID (l’identifiant du processus que vous utiliseriez pour le tuer) et NAME (le chemin réel du fichier auquel on accède).

La colonne FD indique comment le fichier est utilisé. Un nombre suivi de « r » signifie un accès en lecture, « w » en écriture et « u » en lecture et écriture. Si vous voyez « cwd », le processus a cet emplacement comme répertoire de travail courant. Cela se produit lorsque vous avez une fenêtre du Terminal ouverte sur un dossier du disque.

Découvrir ce qui bloque votre disque

Pour les problèmes d’éjection en particulier, il vous suffit généralement de savoir quels noms de processus apparaissent. Les coupables fréquents incluent mds et mds_stores (indexation Spotlight), Finder, QuickLookUIService (génération de vignettes) et fsevents (observateur du système de fichiers).

Si vous voyez beaucoup de lignes et que vous voulez réduire l’affichage, vous pouvez utiliser grep :

lsof /Volumes/YourDriveName | grep -v "^COMMAND"

Cela supprime la ligne d’en-tête pour que vous ne voyiez que les vrais processus. Si vous voulez uniquement les noms de processus uniques :

lsof /Volumes/YourDriveName | awk '{print $1}' | sort -u

Options utiles

L’option -c filtre par nom de commande. Si vous soupçonnez Spotlight d’être en cause :

lsof -c mds /Volumes/YourDriveName

Cela n’affiche que les processus dont le nom commence par « mds ».

L’option +D liste récursivement tous les fichiers ouverts dans un répertoire :

lsof +D /Volumes/YourDriveName

C’est plus exhaustif que la syntaxe de base, mais cela peut être lent sur de grands disques contenant beaucoup de fichiers.

Pour voir quels processus un utilisateur précis a ouverts sur le disque :

lsof -u yourusername /Volumes/YourDriveName

Utiliser lsof sans sudo

Par défaut, lsof n’affiche que les processus appartenant à votre compte utilisateur. Les processus système lancés par root (comme le mds de Spotlight) n’apparaîtront pas, sauf si vous exécutez lsof avec sudo :

sudo lsof /Volumes/YourDriveName

Vous devrez saisir votre mot de passe. Pour dépanner les problèmes d’éjection, utiliser sudo est presque toujours nécessaire, car les processus système sont fréquemment les bloqueurs.

Tuer le processus bloquant

Une fois connu l’identifiant du processus (PID) dans la sortie de lsof, vous pouvez le terminer :

kill 1234

Remplacez 1234 par le PID réel. Si ça ne fonctionne pas, vous pouvez forcer :

kill -9 1234

Soyez prudent avec ceci. Tuer des processus système comme mds peut provoquer des problèmes temporaires. Le processus redémarrera généralement automatiquement, mais vous pourriez voir Spotlight se comporter bizarrement pendant une minute. Tuer des applications comme le Finder est généralement sans danger ; macOS relancera le Finder automatiquement.

Pour les applications que vous contrôlez (comme une fenêtre du Terminal dont le shell se trouve dans le répertoire du disque), il est plus propre de simplement quitter l’application normalement ou de sortir du disque avant d’essayer d’éjecter.

Scénarios courants

Terminal avec le répertoire courant sur le disque : si vous avez fait un cd vers un dossier de votre disque externe, ce processus de shell maintiendra le disque ouvert. Soit vous faites un cd ailleurs (cd ~), soit vous fermez cette fenêtre du Terminal.

Fenêtres du Finder : si le Finder a une fenêtre ouverte sur le disque, ou même s’il a le disque sélectionné dans la barre latérale, il peut empêcher l’éjection. Fermez toute fenêtre du Finder affichant le contenu du disque.

Indexation Spotlight : les processus mds, mds_stores et mdworker indexent automatiquement les nouveaux disques. Vous pouvez attendre qu’ils terminent, désactiver l’indexation avec sudo mdutil -i off /Volumes/YourDriveName, ou les tuer directement.

Apps en arrière-plan avec des fichiers ouverts : certaines applications conservent des références aux fichiers récents même après que vous avez fermé les documents. Les applications créatives comme Photoshop ou les logiciels de montage vidéo sont des coupables fréquents. Quitter complètement l’app libère généralement les fichiers.

Au-delà de la ligne de commande

Si vous n’êtes pas à l’aise avec le Terminal ou que vous ne voulez pas décortiquer la sortie de lsof chaque fois que vous devez débrancher un disque, il existe des options graphiques.

Le Moniteur d’activité peut vous montrer les fichiers ouverts d’un processus précis, mais il faut déjà savoir quel processus inspecter. Il ne répond pas facilement à la question « qu’est-ce qui utilise ce disque ? ».

Ejecta a été conçu spécifiquement pour ce problème. L’app affiche vos disques connectés, identifie quels processus bloquent chacun d’eux et vous permet de quitter ces processus en un clic. C’est essentiellement une interface graphique pour le travail d’enquête que requiert lsof, avec en prime l’intelligence nécessaire pour gérer les processus système en toute sécurité.

La ligne de commande est puissante pour ceux qui la préfèrent, mais elle ne devrait pas être obligatoire pour quelque chose d’aussi simple que débrancher un disque.

Si vous préférez ne pas passer par le Terminal à chaque fois, Ejecta vous montre exactement quel processus bloque votre disque — et vous permet de le quitter d'un seul clic, directement depuis la barre des menus.

Acheter — $9.99