Како користити Линук команду лсоф

Ако у Линук окружењу све представља датотеку, онда се не ради само о датотекама на вашем чврстом диску. У овом упутству ћемо истражити како користити `lsof` команду за преглед свих осталих уређаја и процеса који се третирају као датотеке.

У Линук-у је све датотека

Често цитирана фраза „све у Линук-у је датотека“ има своју тежину. Датотека се може дефинисати као збирка бајтова. Када се читају у оквиру неког програма или шаљу на штампач, оне генеришу ток бајтова. Са друге стране, када се у њих уписује, оне прихватају ток бајтова.

Многе друге системске компоненте такође генеришу или прихватају токове бајтова, на пример тастатуре, мрежне утичнице, штампачи и комуникациони процеси. Пошто сви ови уређаји прихватају, генеришу, или раде обоје са токовима бајтова, њима се може управљати – на ниском нивоу – као да су датотеке.

Овакав дизајн је значајно поједноставио имплементацију Јуникс оперативног система. Омогућио је да се креира мали скуп управљача, алата и API-ја који могу да обрађују широк спектар различитих ресурса.

Подаци и програмске датотеке које се налазе на вашем чврстом диску су типичне датотеке система датотека. Командом `ls` можемо их навести и прибавити информације о њима.

А како да сазнамо више о осталим процесима и уређајима који се такође третирају као датотеке? За то користимо команду `lsof`. Ова команда наводи све отворене датотеке у систему, то јест све што се третира као датотека.

`lsof` команда

Многи процеси или уређаји које `lsof` може да пријави припадају роот кориснику или су покренути од стране роот корисника, зато је потребно користити `sudo` команду са `lsof`.

И како ће овај списак бити веома дугачак, приказаћемо га кроз `less`.

sudo lsof | less

Пре него што се прикаже излаз команде `lsof`, корисници ГНОМЕ окружења могу видети поруку упозорења у прозору терминала.

lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.

`lsof` покушава да обради све монтиране системе датотека. Ова порука упозорења се појављује зато што је `lsof` наишао на ГНОМЕ виртуелни систем датотека (GVfs). Ово је специјална инстанца система датотека у корисничком простору (FUSE). Она служи као посредник између ГНОМЕ окружења, његових API-ја и језгра система. Нико, па чак ни root корисник, нема приступ овим системима датотека осим корисника који их је монтирао (у овом случају, ГНОМЕ). Ову поруку упозорења можете занемарити.

Излаз `lsof` команде је обиман. Крајње леве колоне изгледају овако:

Док крајње десне колоне изгледају овако:

Колоне у `lsof` излазу

Не односе се све колоне на сваки тип отворене датотеке. Сасвим је нормално да неке од њих остану празне.

Команда: Име команде повезане са процесом који је отворио датотеку.
PID: Идентификациони број процеса који је отворио датотеку.
TID: Идентификациони број задатка (нити). Празна колона значи да се не ради о задатку, већ о процесу.
Корисник: ИД корисника или име корисника коме процес припада, или кориснички ИД или пријава особе која је власник директоријума у /proc где `lsof` проналази информације о процесу.
FD: Приказује дескриптор датотеке. Дескриптори датотека су детаљније описани у наставку.
Тип: Тип чвора повезан са датотеком. Типови чворова су детаљније описани у наставку.
Уређај: Садржи бројеве уређаја, одвојене зарезима, за специјалне знакове, специјалне блокове, регуларне, директоријуме или NFS датотеке, или референту адресу језгра која идентификује датотеку. Такође може приказати основну адресу или име уређаја Линук AX.25 сокета.
Величина/Померај: Приказује величину датотеке или помак датотеке у бајтовима.
Чвор: Приказује број чвора локалне датотеке или иноде број NFS датотеке на сервер хосту или тип интернет протокола. Може приказати STR за ток или IRQ или иноде број Линук AX.25 сокета.
Име: Приказује име монтиране тачке и система датотека на којој се датотека налази.

Колона `FD`

Дескриптор датотеке у колони FD може имати различите вредности; ман страница наводи све.

Унос у колони FD може се састојати из три дела: дескриптора датотеке, знака режима и знака закључавања. Неки чести дескриптори датотека су:

cwd: Тренутни радни директоријум.
err: Грешка у информацијама о FD (погледајте колону NAME).
ltx: Текст дељене библиотеке (код и подаци).
m86: DOS спојена мапирана датотека.
mem: Датотека мапирана у меморију.
mmap: Уређај мапиран у меморију.
pd: Родитељски директоријум.
rtd: Основни директоријум.
txt: Текст програма (код и подаци)
Број, који представља дескриптор датотеке.

Знак режима може бити један од следећих:

r: Приступ за читање.
w: Приступ за писање.
u: Приступ за читање и писање.
‘ ‘: Знак размака, ако је режим непознат и нема знака закључавања.
: Режим је непознат и постоји знак закључавања.

Знак закључавања може бити један од:

r: Закључавање за читање на делу датотеке.
R: Закључавање за читање на целој датотеци.
w: Закључавање за писање на делу датотеке.
W: Закључавање за писање на целој датотеци.
u: Закључавање за читање и писање било које дужине.
U: Непознати тип закључавања.
‘ ‘: Знак размака. Нема закључавања.

Колона `TYPE`

Постоји више од 70 уноса који се могу појавити у колони TYPE. Неки уобичајени уноси које ћете видети су:

REG: Обична датотека система датотека.
DIR: Директоријум.
FIFO: Први улази први излазе.
CHR: Специјална датотека знакова.
BLK: Блок специјална датотека.
INET: Интернет утичница.
unix: Утичница UNIX домена

Преглед процеса који су отворили датотеку

Да бисте видели процесе који су отворили одређену датотеку, наведите име датотеке као параметар за `lsof`. На пример, да видите процесе који су отворили `kern.log` датотеку, користите ову команду:

sudo lsof /var/log/kern.log

Излаз `lsof` команде приказује један процес, `rsyslogd`, који је покренут од стране корисника `syslog`.

Преглед свих датотека отворених из директоријума

Да бисте видели датотеке које су отворене из директоријума и процесе који су их отворили, проследите директоријум команди `lsof` као параметар. Морате користити опцију `+D` (директоријум).

Да бисте видели све датотеке које су отворене у директоријуму `/var/log/`, користите ову команду:

sudo lsof +D /var/log/

`lsof` одговара са листом свих отворених датотека у том директоријуму.

Да бисте видели све датотеке отворене из `/home` директоријума, користите следећу команду:

sudo lsof +D /home

Приказују се датотеке које су отворене из `/home` директоријума. Приметимо да, са краћим описима у неким колонама, цео списак је ужи.

Листа датотека које је отворио процес

Да бисте видели датотеке које је отворио одређени процес, користите опцију `-c` (команда). Имајте на уму да `lsof` можете дати више термина за претрагу одједном.

sudo lsof -c ssh -c init

`lsof` пружа листу датотека које је отворио било који од процеса наведених у командној линији.

Преглед датотека које је отворио корисник

Да бисте ограничили приказ на датотеке које је отворио одређени корисник, користите опцију `-u` (корисник). У овом примеру ћемо погледати датотеке које су отворили процеси који су у власништву или покренути у име корисника `mary`.

sudo lsof -u mary

Све наведене датотеке су отворене у име корисника `mary`. Ово укључује датотеке које је отворило окружење радне површине, на пример, или једноставно као резултат тога што се корисник `mary` пријавила.

Искључивање датотека које је отворио корисник

Да бисте искључили датотеке које је отворио корисник, користите оператор `^`. Искључивање корисника из листе олакшава проналажење информација које вас занимају. Морате користити опцију `-u` као и раније и додати знак `^` на почетак имена корисника.

sudo lsof +D /home -u ^mary

Овог пута, листа за `/home` директоријум не укључује ниједну датотеку коју је отворила корисник `mary`.

Листа датотека које је отворио процес

Да бисте навели датотеке које је отворио одређени процес, користите опцију `-p` (процес) и наведите ИД процеса као параметар.

sudo lsof - p 4610

Све датотеке које су отворене помоћу ИД-а процеса који наведете су наведене за вас.

Навођење ИД-ова процеса који су отворили датотеку

Да бисте видели ИД-ове процеса за процесе који су отворили одређену датотеку, користите опцију `-t` (кратко) и наведите име датотеке у командној линији.

sudo lsof -t /usr/share/mime/mime.cache

ИД-ови процеса су приказани у једноставној листи.

Коришћење `AND` и `OR` претраге

Хајде да наведемо датотеке које је отворила корисница `mary`, а које се односе на `ssh` процесе. Знамо да можемо да обезбедимо више од једне ставке за претрагу на командној линији, тако да би ово требало да буде лако.

sudo lsof -u mary -c ssh

Сада погледајмо излаз из `lsof`. То не изгледа у реду; постоје уноси у излазу који су покренути од стране `root` корисника.

То није оно што смо очекивали. Шта се десило?

Када наведете више термина за претрагу, `lsof` ће вратити било коју датотеку која одговара првом термину за претрагу или другом термину за претрагу, итд. Другим речима, врши претрагу `OR`.

Да би `lsof` извршио `AND` претрагу, користите опцију `-a` (и). То значи да ће једине датотеке које ће бити наведене бити оне које одговарају првом термину за претрагу, и другом термину за претрагу, итд.

Хајде да покушамо то поново и користимо опцију `-a`.

sudo lsof -u mary -c ssh -a

Сада је свака датотека на листи она коју је отворила `mary` или у њено име и је повезана са `SSH` командом.

Аутоматско освежавање екрана

Можемо користити опцију `+|-r` (понављање) да ставимо `lsof` у режим понављања. Опција понављања се може применити на два начина, `+r` или `-r`. Такође морамо додати број секунди које желимо да `lsof` сачека пре освежавања екрана.

Коришћење опције понављања у било ком формату чини да `lsof` приказује резултате као и обично, али додаје испрекидану линију на дно екрана. Он чека број секунди који је наведен у командној линији, а затим освежава екран новим скупом резултата.

Са опцијом `-r` ово ће се наставити све док не притиснете `Ctrl+C`. Са `+r` форматом, наставиће се све док нема резултата за приказ или док не притиснете `Ctrl+C`.

sudo lsof -u mary -c ssh -a -r5

Обратите пажњу на испрекидану линију на дну листе. Ово раздваја сваки нови приказ података када се излаз освежи.

Приказ датотека повезаних са интернет везама

Опција `-i` (интернет) вам омогућава да видите датотеке отворене процесима повезаним са мрежним и интернет конекцијама.

lsof -i

Приказују се све датотеке које су отвориле мрежне и интернет везе.

Приказивање датотека повезаних са интернет везама према ИД-у процеса

Да бисте видели датотеке које отварају интернет везе које су повезане са одређеним ИД-ом процеса, додајте опцију `-p` и опцију `-a`.

Овде тражимо датотеке отворене путем интернета или мрежне везе, процесом са ИД-ом 606.

sudo lsof -i -a -p 606

Приказују се све датотеке које је отворио процес ИД 606 које су повезане са интернет или мрежним везама.

Приказ датотека повезаних са интернет везама и командама

Можемо користити опцију `-c` (команда) да тражимо датотеке отворене одређеним процесима. Да бисте потражили датотеке које су отвориле интернет или мрежне везе повезане са `ssh` процесом, користите следећу команду:

lsof -i -a -c ssh

Све датотеке отворене због `ssh` процеса су наведене у излазу.

Приказ датотека повезаних са интернет конекцијама и портовима

Можемо да направимо `lsof` извештај о датотекама које су отвориле интернет или мрежне везе на одређеном порту. Да бисмо то урадили, користимо знак `:` иза којег следи број порта.

Овде тражимо од `lsof`-а да наведе датотеке које су отворене мрежном или интернет конекцијом користећи порт 22.

lsof -i :22

Све наведене датотеке отворили су процеси повезани са портом 22 (који је подразумевани порт за `SSH` везе).

Приказ датотека повезаних са Интернет везама и протоколима

Можемо тражити од `lsof`-а да прикаже датотеке које су отворили процеси повезани са мрежним и интернет конекцијама, а који користе одређени протокол. Можемо бирати између `TCP`, `UDP` и `SMTP`. Хајде да користимо `TCP` протокол и видимо шта добијамо.

sudo lsof -i tcp

Једине наведене датотеке су оне које отварају процеси који користе `TCP` протокол.

Само смо загребали површину

Ово је добра основа за неке уобичајене случајеве употребе за `lsof`, али има много више од тога