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ă
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 ./