Solaris - Retrouver rapidement les process accédant à un fichier avec fuser et ps

Introduction

La commande fuser sous Solaris est très pratique pour retrouver si il existe des process qui accèdent à un répertoire ou à un fichier.

Exemple dans cet article : l'étude des process qui accèdent au fichier sybase_exploit.log qui a explosé le quota d'une zone ZFS Solaris

sybase@SRVUNXFR3> fuser -fu sybase_exploit.log 
sybase_exploit.log:    21363o(sybase)   21362o(sybase)   17003o(sybase)
   14722o(sybase)   14721o(sybase)   14720o(sybase)   14719o(sybase)
   14428o(sybase)   14378o(sybase)   14332o(sybase)   14311o(sybase)
   ...

Pour obtenir uniquement la liste des ID des process (PID) sans aucun formatage de la commande fuser, renvoyer la sortie STDERR vers /dev/null :

sybase@SRVUNXFR3 > fuser sybase_exploit.log 2> /dev/null
   24061   24060   17003   14722   14721   14720   
14719   14718   14717   14716   14662   14625   14624   14623   
14622   14586   14581 

Lorsque la liste des process est négligeable, le programme correspondant à un process ID (PID) peut être retrouvé manuellement avec la commande ps qui liste les process :

sybase@SRVUNXFR3> ps -ef | grep 14428
sybase 14428   1  0 14:51:01 pts/1   0:00 /Software/sybase/sybase-15.0.3-64b/ASE-15_0/bin/backupserver -SDTH_U1_BCK -e/So

En revanche l'opération manuelle devient très fastidieuse lorsque le nombre de process est élevé dans le résultat de la commande fuser.

Avant de se lancer dans le développement d'un script shell, 2 astuces très pratiques et à retenir sont proposées dans cet article :

  • Combiner fuser et ps en une seule ligne de commandes afin de lister tous les programmes qui accèdent à un répertoire ou à un fichier.
  • Lancer la commande kill en masse avec fuser pour tuer tous les programmes qui accèdent à un répertoire ou à un fichier.

Retrouver les programmes qui accèdent à un fichier ou à un répertoire en une seule ligne de commande avec ps et fuser

Une simple ligne de commande combinant les commandes ps et fuser affiche instantanément les programmes qui accèdent à un fichier (sybase_exploit.log dans l'exemple ci-dessous) :

ps -o pid,args -p "$(fuser sybase_exploit.log 2>/dev/null)"
  PID COMMAND
14247 /Software/sybase/sybase-15.0.3-64b/ASE-15_0/bin/dataserver -sDAS_U1_ASE -d/DAS/
14279 /Software/sybase/sybase-15.0.3-64b/ASE-15_0/bin/dataserver -sDTH_U1_ASE -d/DTH/
14311 /Software/sybase/sybase-15.0.3-64b/ASE-15_0/bin/dataserver -sMIP_U1_ASE -d/MIP/
14332 /Software/sybase/sybase-15.0.3-64b/ASE-15_0/bin/dataserver -sSMA_U1_ASE -d/sma/
17003 /bin/ksh dba/bin/update_statistics.ksh -D SMA_U1_ASE -Mindex
24060 isql -Usa -D smartco -SSMA_U1_ASE -i/Software/sybase/dba/scratch/upstat.SMA_U1_
24061 grep -v ^Password:

L'option -p de la commande ps accepte en paramètre une liste de process PID. Cette liste de process est le résultat de la commande fuser en supprimant la sortie STDERR vers /dev/null.

Tuer massivement avec la commande fuser et l'option kill les programmes qui accèdent à un fichier ou à un répertoire

Voici un exemple avec 2 process qui accèdent au fichier spa.log :

 ps -o pid,args -p "$(fuser  spa.log 2>/dev/null)"
  PID COMMAND
25507 isql -Usa -ospa.log
25554 isql -Usa -ospa.log

À utiliser avec précaution et en connaissance de cause, la commande fuser avec l'option -k tue en une seule ligne de commande les process accédant au fichier spa.log sans devoir lancer unitairement la commande kill :

fuser -k -u spa.log
spa.log:    25554o(sybase)   25507o(sybase)
SMA_U1_ASE > isql -Usa -ospa.log
Password: 
Killed