Linux Хто використовує ці файли?, Linux, Операційні системи, статті

Станіслав Лапшанскій

Одного разу вранці, коли мені здавалося, що в усьому світі не вистачить кофеїну що б прокинутися, я вирішив сховатися від публіки і розібратися зі списком різноманітних дрібниць вимагають моєї уваги. Серед іншого мені було потрібно скопіювати деякі файли з компакт діскa на вінчестер. Зрозуміло, для початку слід було встановити необхідний диск в привід. Чи не правда неважко? Проте, ось невдача:

# umount /cdrom/
umount: unmount of /cdrom failed: Device busy
#

Така помилка виникає в разі спроби демонтувати CD-ROM використовується в цей момент. Я сидів прямо перед лицьовою панеллю комп’ютера, але не помітив ні моргання лампочки на приводі, ні шуму обертового мотора. CD-ROM був змонтований, але явно не використовувався.

В даному випадку у мене було кілька способів вирішення цієї проблеми. Я міг перезавантажити машину, при цьому роздратований користувачів. З одного боку розлючені користувачі досить забавні, а з іншого, вони можуть породити масу проблем. У той же час я міг би зайнятися з’ясуванням у кожного користувача, не використовує він CD-ROM, однак це означало б, необхідність вилізли зі зручного крісла і, о ні, спілкування з людьми. В принципі я міг би примусово демонтувати компакт диск, але я поняття не мав наскільки це може бути руйнівним для нещасного користувача. І, нарешті, я міг би з’ясувати чому система вважає CD-ROM зайнятим і персонально розібратися з винним. Оскільки цей спосіб передбачає мінімальний контакт з людьми, я вибрав саме його. Для з’ясування того, хто і які файли використовує, застосовується утиліта fstat (1).

Згідно сторінці онлайнового керівництва, утиліта fstat (1) призначена для «ідентифікації активних файлів». Хоча це не так помітно, але в системі UNIX будь-який об’єкт є файлом. У більш пізніх операційних системах (типу Plan 9), реалізація цієї ідеї досягла логічного досконалості – там навіть канали і мережеві з’єднання представляються у вигляді файлів. Отже, маючи можливість дізнатися список використовуваних в даний момент файлів, ви можете досконально з’ясувати, що відбувається в системі. fstat (1) робить знімок стану системи в даний момент часу. Оскільки програми тільки і займаються, що постійно відкривають і закривають всякі файли, канали й мережні з’єднання, результат роботи fstat змінюється від запуску до запуску.

Якщо ви надрукуєте в командному рядку «fstat», то побачите на екрані список всіх використовуваних в системі файлів. Цей список може бути дуже довгим, так як кожен процес зазвичай відкриває не один файл, а декілька. Мій ноутбук на якому виконується стандартний набір «офісних» додатків, зазвичай містить близько 400 відкритих файлів. На невеликому веб-сервері мого друга відкрито близько 9000 файлів. На деяких сильно завантажених серверах це значення сягає 30 тисяч. Для того що б життя не здавалося вам медом, програми постійно відкривають і закривають файли, так що кількість відкритих файлів постійно змінюється. fstat (1) робить моментальний знімок системного списку відкритих файлів, так що якщо ви кілька разів запустите fstat ви напевно отримаєте різні результати.

Ось невеликий шматочок того, що fstat видала на екран мого ноутбука:

….
mwlucas ssh 2820 3* internet stream tcp c2ef2814
mwlucas rxvt 2819 root / 2 drwxr-xr-x 512 r
mwlucas rxvt 2819 wd /usr 846337 drwxr-xr-x 2560 r
mwlucas rxvt 2819 text /usr 802549 -rws–x–x 89092 r
mwlucas rxvt 2819 2 /dev 60 crw——- ttyv0 rw
mwlucas rxvt 2819 3* local stream c2ebdbd0 <-> c2ebd870
mwlucas rxvt 2819 4 /dev 104 crw-rw-rw- ptyp0 rw
mwlucas mozilla-bin 2725 root / 2 drwxr-xr-x 512 r
mwlucas mozilla-bin 2725 wd /usr 808118 drwxr-xr-x 1536 r
….

Ось як багато інформації. Що ж вона означає?

У першому стовпчику знаходиться ім’я користувача, який відкрив файл. У другому – ім’я програми, яка це зробила. Оскільки ім’я програми не завжди буває корисно для реальних потреб, в третьому стовпці міститься PID – ідентифікатор процесу в системі.

Починаючи з четвертого стовпця відомості стають цікавішими. Четвертий стовпець може містити або просто число, або число з зірочкою, або ключове слово. Числом позначається внутріпроцессовий дескриптор файлу. Коли процес відкриває файли, для організації доступу до них, він призначає їм номери (тобто дескриптори). Рядки виведення fstat (1), в яких у четвертому стовпці стоїть число, містять інформацію про записуваних або читаються процесом файлах.

Якщо в четвертому стовпці знаходиться число з зірочкою (як наприклад в першому рядку наведеного мною прикладу виведення fstat), то в рядку описується сокет. Це може бути UNIX-сокет, мережевий сокет або іменований канал. Рядок описує сокет може змінюватися в залежності від виду описуваного нею сокета. Зараз ми не будемо заглиблюватися в сокети. Утиліта fstat (1) не надто корисна при дослідженні мережевих з’єднань під FreeBSD, а ось в OpenBSD fstat видає IP-адресу та номер порту відкритого з’єднання. Вид висновку може змінюватися в залежності від операційної системи. Перевірте, що видасть fstat у вас.

Якщо в четвертому стовпці міститься слово «text», то це зовсім не означає, що файл текстовий. Навпаки, це означає що файл є «комп’ютерним» текстом, тобто програмою. (Тільки комп’ютерники можуть додуматися, що «текст» може означати «комп’ютерний текст»). Загалом, це означає, що процес запустив виконуваний файл.

Слово «wd» означає, що це робочий каталог процесу. Робочий каталог, це каталог, звідки запускаються програми. Наприклад, у вас може бути запущений шелл, який просто «сидить» в якомусь каталозі і нічого не робить, при цьому каталог в якому він сидить є робочим.

Четвертий стовпець може містити й інші ключові слова, ми описали лише найпоширеніші.

У п’ятому стовпці знаходиться інформація про точку монтування файлової системи, в якій знаходиться використовуваний процесом файл, а в шостому – його номер в індексному таблиці. Трохи пізніше ми скористаємося цією інформацією для того, щоб з’ясувати ім’я файлу.

Потім йдуть права доступу до файлу, в стандартному UNIX-форматі.

Вміст сьомого стовпця залежить від того, описується чи в рядку звичайний файл або файл пристрою. Якщо описується звичайний файл, то сьомий стовпець містить її розмір у блоках. А якщо мова йде про файлі пристрою, то назва цього пристрою.

І нарешті нам показують стан «читання / запису» цього файлу. Якщо файл відкрито для читання, то ви побачите «r», якщо для запису, то «w». Поєднання «rw», як ви легко можете здогадатися, з’являється, коли файл відкритий як для читання, так і для запису.

Все це дуже круто, залишається тільки зрозуміти, як ми можемо скористатися цією міццю. Ви ж не зможете відсортувати з висновку fstat 400 рядків відкинувши непотрібні 30000. Зрозуміло, ви можете фільтрувати дані за допомогою команди grep (1), але досить часто ви просто не зможете чітко сформулювати критерії пошуку для grep. Для полегшення вашої долі в утиліті fstat передбачено три потужних фільтруючих ключа. Ви можете одночасно використовувати будь-які з них.

Ключ «-f» вибирає записи по точці монтування. Якщо ви зацікавилися, які файли використовуються в каталозі / usr / home / mwlucas, то це слушна нагода для використання ключа «-f». Зверніть увагу, що fstat не обмежується у своїх пошуках конкретних зазначеним каталогом, а шукає відкриті файли на всій файлової системи, в якій розташовується каталог з даними користувачів. Таким чином команда «Fstat-f / usr / home / mwlucas» видасть нам список відкритих файлів у файловій системі / usr, тобто в системі, де в мене змонтований домашній каталог.

Ключ «-u» фільтрує видачу на ім’я користувача. Для того що б з’ясувати які я використовую в даний момент файли, я можу запустити на виконання команду «fstat-u mwlucas». Якщо потрібно дізнатися список файлів, зайнятих конкретним процесом, можна скористатися ключем «-p» вказавши як параметр ідентифікатор цікавить процесу.

Тепер давайте повернемося до наших баранів. У мене є привід компакт-дисків який хтось зайняв. Ким він використовується? У моїй системі CD-ROM монтується в каталог / cdrom. Для фільтрації я скористаюся прапором «-f».

# fstat -f /cdrom
chris tcsh 2834 wd /cdrom 141312 dr-xr-xr-x 6144 r
#

Використовується лише один файл. Виявляється цього достатньо, що б я не зміг розмонтувати диск. Файл відкрито користувачем «chris». Звернемо увагу на четвертий стовпець, в якому міститься ключове слово «wd». Він означаючи, що відкритий файл насправді є каталогом і в ньому просто «сидить» якийсь інтерпретатор команд. Більше ніякої активності у файловій системі не проявляється.

Не слід забувати, що fstat надає лише «знімок», моментальне стан, поточної активності у файловій системі. Для того що б бувальщина впевненим, що я не потрапив в момент, коли Кріс просто нічого не робить, я міг би спробувати запустити утиліту fstat кілька разів. Якщо компакт диск використовується, то fstat покаже на ньому ще якісь відкриті файли. В даному випадку для такої перевірки можна було б просто подивитися на лампочку CD-ROM’а. Але для нас це надто просто. Втім, у кожному випадку, результат буде однаковий.

Я візьму телефон, подзвоню Крісу і скажу йому, що б він вивів цей чортовий шелл з каталогу / cdrom, якщо він все-таки не збирається нічого в ньому робити.

Може статися, що fstat виявиться свідком інтенсивної роботи здійснюється Крісом в каталозі / cdrom. У такому випадку для користувача ім’я Кріса буде неодноразово згадуватися в записах численних відкритих файлів в цьому каталозі. Тоді мені доведеться обговорити з ним спосіб виконання моєї і його завдання прийнятним для обох способом.

Якщо Кріс просто недоступний, скажімо він пішов додому спати і залишив свій термінал заблокованим, я можу просто вбити цей командний процесор. Вранці він звичайно розсердиться, але мені на це наплювати. В залежності від вашої ситуації ви можете не захотіти прибивати шелл іншого користувача, а ось я, відчуваю себе чудово, коли мені надається можливість «вбити» небудь крісовское, тому саме так я і вчиню. У третьому стовпці вказаний ідентифікатор процесу нашого інтерпретатора, який висить десь всередині каталогу / cdrom.

# kill -1 2834
# umount /cdrom
#

В принципі я міг би насильно демонтувати CD-ROM, скориставшись командою unmount з ключем «-f». UNIX надає масу різноманітних шляхів вирішення цього питання. Вибирайте вподобаний.

Однією з найбільш неприємних особливостей утиліти fstat є те, що вона видає лише номер запису в індексному таблиці, а не нормальне ім’я файлу. Втім, це не така вже й проблема. Ви легко можете знайти назва файлу за його номером за допомогою команди find (1). Для обмеження області пошуку однією точкою монтування (тобто файлової системою), скористайтеся ключем «-x».

На своєму ноутбуці я користуюся програмної cvsupd (про те що це таке читайте www.onlamp.com/pub/a/bsd/2001/08/30/Big_Scary_Daemons.html). Якщо мені несподівано захочеться дізнатися, куди ця програма пише свої журнали, то для з’ясування я можу переглянути сценарії її запуску, конфігураційні файли та сторінки онлайнового керівництва. Або я можу просто подивитися які файли використовується cvsupd.

# ps -ax | grep cvsupd
199 ?? Is 0:00.00 cvsupd -e -C 100 -l @daemon -b /usr/local/etc/cvsup –
#

Отже, cvsupd виконується під ідентифікатором 199.

# fstat -p 199
cvsup cvsupd 199 root / 2 drwxr-xr-x 512 r
cvsup cvsupd 199 wd /var 40 drwxrwxrwt 512 r
cvsup cvsupd 199 text /usr 1541084 -rwxr-xr-x 891596 r
cvsup cvsupd 199 0 /dev 10 crw-rw-rw- null rw
cvsup cvsupd 199 1 /var 1759 -rw-rw-r– 0 w
cvsup cvsupd 199 2 /var 1759 -rw-rw-r– 0 w
cvsup cvsupd 199 3* internet stream tcp c2ef1100
cvsup cvsupd 199 4* pipe c2e07000 <-> c2e06f20 0 rw
cvsup cvsupd 199 5* pipe c2e06f20 <-> c2e07000 0 rw
cvsup cvsupd 199 6* local dgram c2ebde10 <-> c2ebe000
#

Оскільки ми шукаємо файл журналу (тобто текстовий файл, відкритий на запис – прим. Перекладача), то в четвертому стовпці повинна бути цифра. Третя, четверта і п’ята рядок є файлами. Подивимося, що у цих рядків перебуває в п’ятому стовпці. Отже, третій рядок цей пристрій (знаходиться в каталозі / dev), так що цей рядок відпадає. У нас залишилися четверта і п’ята рядки, які вказують на відкрите щось, що знаходиться всередині каталозі / var. У шостому стовпці міститься номер запису в індексному таблиці. В обох рядках він дорівнює 1759.

# find -x /var -inum 1759
/var/tmp/cvsupd.out
#

Мені ніколи б не спало на думку шукати файл журналу в такому місці, але на щастя fstat позбавила мене від необхідності про це здогадуватися.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*