marți, 21 februarie 2012

5 exemple practice de utilizare a comenzii ‘fuser’ în Linux

Traducerea articolului:
5 Practical Linux fuser Command Examples 

Utilitarul fuser’ din Linux este un instrument foarte puternic. După cum sugerează şi numele, el oferă informaţii despre utilizatorul sau despre procesul care foloseşte un anumit fişier sau director.
Funcţionalitatea  utilitarului 'fuser' nu se rezumă însă doar la oferirea informaţiilor despre procese. Acest articol explică cum poate fi folosit utilitarul 'fuser' cu ajutorul a 5 exemple practice.


1. Cine foloseşte un fişier sau un director?

Aceasta este utilitatea de bază a comenzii 'fuser': identifică ce procese folosesc un anumit fişier sau director.
$ fuser  .
./:                   3965c  4175c  4281c  4334c  4337c
În exemplul de mai sus utilitarul 'fuser' a fost rulat pentru a găsi toate procesele ce folosesc directorul curent ‘./'’
Observăm că output-ul comenzii consistă într-o enumerare de identificatoare de procese (PID-uri), dar toate PID-urile sunt urmate de caracterul ‘c’. Acesta indică tipul de acces. Tipul de acces poate fi:
  • c      directorul curent
  • e      executabilul rulat
  • f      fişier deschis. f este omis în modul de afişare implicit
  • F     fişier deschis pentru scriere. F este omis în modul de afişare implicit
  • r      directorul rădăcină
  • m     fişier mmap sau librărie partajată
‘c’ comunică faptul că procesele listate folosesc directorul drept director curent
Folosiţi opţiunea '–v' pentru a obţine informaţii detaliate:
$ fuser -v ./
           USER        PID ACCESS COMMAND
./:       himanshu   3965 ..c..    bash
          himanshu   4175 ..c..    gedit
          himanshu   4281 ..c..    bash
          himanshu   4334 ..c..  socket_serv
          himanshu   4337 ..c..    bash
Putem observa că rularea comenzii 'fuser' având drept parametru directorul curent permite aflarea unor informaţii suplimentare cu privire la procesele ce folosesc acest director.

2. comanda 'fuser' având drept parametru un executabil

Socket_serv este un executabil (un program scris în C care ascultă pe un port TCP)
$ ./socket_serv
În cazul în care apelam comanda 'fuser' având ca parametru acest executabil vom obţine următorul output:
$ fuser -v socket_serv
                     USER        PID    ACCESS       COMMAND
socket_serv:         himanshu   4334    ...e.        socket_serv
În acest caz ‘e’ indică faptul că fişierul este executabil.

3. Verificarea proceselor ce utilizează socket-uri TCP/UDP

Folosind comanda 'fuser' putem verifica de asemenea ce procese utilizează socket-uri TCP/UDP. Programul de mai sus, socket_serv, deschide portul TCP 5000.  
Putem folosi comanda 'fuser' având drept parametru portul tcp.
$ fuser -v -n tcp 5000
                       USER        PID ACCESS COMMAND
5000/tcp:            himanshu   4334   F....  socket_serv
Vom obţine informaţii detaliate despre procesul ce rulează pe portul 5000.
În afară de cazurile prezentate, putem folosi parametrul ‘-m’ pentru a afişa toate procesele ce folosesc sisteme de fişiere montate (de exemplu: drive USB)

4. Oprirea proceselor care utilizează un anumit program

Până acum am aflat că utilitarul 'fusar' oferă informaţii despre procese care utilizează fişiere, directoare, socket-uri, etc.… Puterea comenzii însă nu se limitează doar la afişarea informaţiilor despre procese. Folosind aceasta comanda se pot, de asemenea, opri acele procese.
Am aflat că un server TCP rulează pe sistem si accesează fişierul binar socket_serv. Putem încerca acum să oprim procesul ce utilizează acest fişier folosind 'fuser'.
$ fuser -v -k socket_serv
                      USER        PID ACCESS COMMAND
socket_serv:         himanshu   4334 ...e.   socket_serv
De remarcat că s-a utilizat paramentrul ‘-k’ pentru a opri procesul ce utilizează fişierul ‘socket_serv’.  În terminalul în care serverul rulează va apare:
$ ./socket_serv
Killed

5. Oprirea interactivă a unui proces utilizând 'fuser'

În exemplul de mai sus am văzut că opţiunea ‘-k’ este folosită în cazul în care dorim să oprim procesele ce utilizează un anume fişier. Dacă însă dorim să evitam oprirea accidentală a unui proces util, acesta opţiune se poate folosi împreună cu opţiunea ‘-i’. Dacă folosim această opţiune, comanda ‘fuser’ va rula în mod interactiv şi va solicita aprobare înainte de oprirea vreunui proces.

Exemplu:
$ fuser -v -k -i socket_serv
                      USER        PID ACCESS COMMAND
socket_serv:         himanshu   5643 ...e.   socket_serv
Kill process 5643 ? (y/N) y
Se poate observa că folosind optiunea ‘-k’ se pot opri selectiv procesele ce utilizează un anumit fişier.
Să presupunem acum că dorim să ştergem un fişier utilizat de mai multe procese. În acest caz  se poate folosi comanda ‘fuser’ pentru a opri toate procesele (sau anumite procese) ce utilizează acest fişier.
$ fuser -v -k -i ./
           USER        PID ACCESS COMMAND
./:       himanshu   3965 ..c..    bash
          himanshu   4175 ..c..    gedit
          himanshu   4281 ..c..    bash
          himanshu   4334 ..c..  socket_serv
          himanshu   4337 ..c..    bash
Kill process 3965 ? (y/N) y
Kill process 4175 ? (y/N) y
Kill process 4281 ? (y/N) y
Kill process 4334 ? (y/N) y
Kill process 4337 ? (y/N) y
De remarcat că utilizarea parametrului ‘-k’ transmite un semnal SIGKILL către procesul ce utilizează un anumit fişier. Se poate folosi opţiunea -<SEMNAL>’ pentru a transmite oricare alt semnal. Lista semnalelor pe care comanda fuser le poate transmite este următoarea:
$ fuser -l
HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED
 
De exemplu, următoarea comandă transmite semnalul SIGHUP în locul semnalului SIGKILL implicit, când se foloseşte opţiunea ‘-k’.
 
$ fuser -v  -k -HUP -i ./