Linux кем занято устройство

Обновлено: 05.07.2024

Я попытался rm -rf открыть папку и получил «устройство или ресурс занят».

В Windows я бы использовал LockHunter, чтобы решить эту проблему. Что такое эквивалент Linux? (Пожалуйста, дайте в качестве ответа простой метод «разблокировать этот», а не полные статьи, подобные этой . Хотя они полезны, в настоящее время меня интересует только ASimpleMethodThatWorks ™)

Спасибо, это было удобно - я переходил с Linux на Windows, искал эквивалент lsof - LockHunter. Что за черт? Unix не мешает вам удалять открытые файлы, как это делает Windows. Вот почему вы можете удалить всю систему, запустив rm -rf / . она с радостью удалит каждый файл, включая / bin / rm. @psusi, это неправильно. У вас либо плохой источник информации, либо вы просто выдумываете. Linux, как и Windows, имеет блокировку файлов и устройств. Это немного сломано, хотя. 0pointer.de/blog/projects/locking.html @foobarbecue, обычно это только рекомендательные блокировки, и страница руководства, по крайней мере, указывает, что они предназначены только для чтения / записи, а не для удаления ссылок.

Инструмент, который вы хотите lsof , это означает, что список открытых файлов .

У него много опций, поэтому проверьте страницу руководства, но если вы хотите увидеть все открытые файлы в каталоге:

Это будет проходить через файловую систему /path , так что будьте осторожны, делая это на больших деревьях каталогов.

Как только вы узнаете, в каких процессах открыты файлы, вы можете выйти из этих приложений или убить их с помощью kill(1) команды.

@marines: Проверьте, смонтирована ли другая файловая система ниже /path . Это одна из причин скрытых «открытых файлов». Команда lsof непосредственно к пути не работает. Таким образом, в основном нужно перейти в путь и запустить lsof busy_file, а затем завершить весь процесс lsof кажется, ничего не делает для меня: lsof storage/logs/laravel.log ничего не вернул, и так сделал lsof +D storage/logs/ . umount ответил с not mounted . Просто чтобы уточнить ответ @camh: используйте mount | grep <path> . Это показывает, что любой /dev/<abc> может быть установлен на <path> . Используйте, sudo umount -lf /dev/<abc> а затем попробуйте удалить <path> . Работает для меня. Спасибо @camh

иногда это является результатом проблем с монтированием, поэтому я размонтирую файловую систему или каталог, который вы пытаетесь удалить:

Без четверти четыре. Спасибо человек, ты спас мне ночь. Веселое. На одной линии - так много потерянного времени -.- ' моей проблемой был каталог журналов, смонтированный как / dev / mapper / vg00-root Помог мне выбраться из аналогичного джема на моталках. в моем случае Дженкинс не размонтировал chroot dir после прерывания задачи в моем случае размонтирование с рабочим столом Ubuntu сработало !! Спасибо

Я использую fuser для такого рода вещи. Он покажет, какой процесс использует файл или файлы в монтировании.

fuser помогает только в конкретном случае, когда вы хотите размонтировать файловую систему. Здесь проблема состоит в том, чтобы найти то, что использует определенный файл. Извините, неправильное возражение: fuser здесь не помогает, потому что проблема в том, чтобы найти все открытые файлы в дереве каталогов. Вы можете сказать, lsof чтобы показать все файлы и фильтр, или сделать его рекурсивным; fuser не имеет такого режима и должен вызываться для каждого файла. @Giles: fuser работает будет списки. Попробуйте fuser /var/log/* , если какие-либо журналы открыты, он скажет, какие и у кого есть открытые. Если простой шаблон, не будет работать, find с или без xargs будет делать эту работу. lsof не было в моем пути, пока fuser был, позволяя мне найти идентификатор процесса, который нарушает работу, чтобы убить, так что + 1 + спасибо. Было бы интересно узнать, откуда берутся эти загадочные файлы.

У меня была такая же проблема, построил однострочник, начиная с рекомендации @camh:

Команда awk захватывает PIDS. Команда tail избавляется от надоедливой первой записи: «PID». Я использовал -9 на kill, другие могли бы иметь более безопасные варианты.

Чтобы сделать его более универсальным, вы можете использовать ./ для текущего каталога вместо журнала /

У меня была эта проблема, когда автоматизированный тест создал виртуальный диск. Команды предложили в других ответах, lsof и fuser , не помогал. После тестов я попытался размонтировать его, а затем удалить папку. Я был действительно смущен целую вечность, потому что я не мог избавиться от этого - я продолжал получать "Устройство или ресурс занят" !

Случайно я узнал, как избавиться от виртуального диска. Мне пришлось размонтировать его столько раз, сколько я выполнил mount команду, т.е. sudo umount path

Из-за того, что он был создан с использованием автоматического тестирования, он монтировался много раз, поэтому я не мог избавиться от него, просто размонтировав его один раз после тестов. Итак, после того, как я вручную размонтировал его много раз, он, наконец, снова стал обычной папкой, и я смог удалить его.

Надеюсь, это может помочь кому-то, кто сталкивается с этой проблемой!

Я часто сталкиваюсь с этим на серверах с сетевыми файловыми системами NFS. Я предполагаю, что это как-то связано с файловой системой, поскольку файлы обычно называются как .nfs000000123089abcxyz .

Мое типичное решение - переименовать или переместить родительский каталог файла, а затем вернуться позже через день или два, и файл будет удален автоматически, и в этот момент я могу свободно удалить каталог.

Обычно это происходит в каталогах, где я устанавливаю или компилирую программные библиотеки.

Отбросив вопрос Прабхата выше, у меня была эта проблема в macos high sierra, когда я застрял в процессе encfs, перезагрузка решила его, но это

Показал мне процесс и PID (столбец два).

Если у вас есть доступ к серверу, попробуйте

Удаление этого каталога с сервера

Или, сделайте umount и снова смонтируйте , попробуйте umount -l : lazy umount, если вы столкнулись с какой-либо проблемой обычного umount.

Сейчас я даже уже и не вспомню, откуда я это знал, но где-то в глубинах подсознания мелькнула мысль, что для решения этой проблемы можно использовать утилиту lsof . Кстати, один из читателей моей книги [3] в своем отзыве на книгу в качестве недостатка указал на то, что эта утилита в книге не описана. Я и решил попытаться применить lsof для решения своей задачи, и начал, естественно, с изучения справки, выдаваемой командой man lsof . А кроме того, поискал информацию в Интернет и нашел статьи 5. Все эти материалы и послужили основой для настоящей статьи.

Для чего служит команда lsof

Относительно lsof справка man как раз сообщает, что lsof есть сокращение от LiSt of Open Files, и что утилита эта служит для вывода информации о том, какие файлы используются теми или иными процессами. Причем утилита эта имеется в очень многих версиях и диалектах UNIX, включая Linux версии 2.1.72 и выше, а также в HP-UX, AIX, NextStep, Apple Darwin для Power Macintosh, SCO UnixWare, Solaris, FreeBSD, NetBDS, OpenBSD и так далее.

abe/ , где вы можете найти исходные коды программы. Их можно также скачать с FTP-сайта ftp://vic.cc.purdue.edu/pub/tools/unix/lsof. О том, как скомпилировать и установить программу, вы можете прочитать в статье [8].

Если запустить эту утилиту без параметров, выдается информация о всех работающих процессах и открытых ими файлах. Даже в моей системе с одним пользователем эта команда выдала 2344 строки текста. Попробуй проанализируй эту массу информации! Но давайте взглянем хотя бы на несколько строк ее вывода, чтобы на этом примере понять, какую же информацию она выдает.

Кстати, если вы будете экспериментировать, имейте в виду, что будучи запущенной простым пользователем, эта команда выдает информацию только о процессах, запущенных этим пользователем. Поэтому во многих случаях вы можете не получить от нее никакого ответа. Если вы хотите получить вразумительный ответ на любой свой запрос, ее необходимо запускать от имени root-а (можно воспользоваться следующей формой запуска sudo lsof ). Кроме того, команда отрабатывает достаточно медленно, так что будьте терпеливы и не щелкайте раньше времени <Ctrl>+<C> - программа не зависла, просто идет поиск информации.

А теперь смотрим листинг 1 (или результат работы программы на вашем экране).

Листинг 1. Вывод команды lsof.

Как видите, один и тот же процесс открывает много файлов, каждому из которых соответствует строка в выводе lsof . В начале строки указывается имя процесса, его идентификатор, имя пользователя, запустившего процесс. В столбце FD стоит номер файлового дескриптора или одна из следующих буквенных комбинаций (я не берусь корректно перевести на русский язык некоторых из расшифровок этих сокращений, так что привожу их в том виде, как они выдаются справочной системой):

  • cwd - текущий рабочий каталог;
  • ltx - текст разделяемой библиотеки;
  • mxx - hex memory-mapped type number xx.
  • m86 - DOS Merge mapped file;
  • mem - файл, загруженный в память (memory-mapped file), чаще всего – библиотека,
  • mmap - memory-mapped device;
  • pd - родительский каталог;
  • rtd - корневой каталог;
  • txt – текст программы (код и данные);
  • v86 - VP/ix mapped file.

Номер файлового дескриптора сопровождается символом, указывающим режим, в котором файл был открыт:

  • r - файл открыт для чтения;
  • w – файл открыт для записи;
  • u - файл открыт для чтения и для записи;
  • пробел – режим доступа неизвестен и файл не блокирован;
  • ‘-’ - режим доступа неизвестен, но на файл установлена блокировка.

В последнем случае за дефисом следует еще один символ, определяющий тип блокировки (подробнее смотри man lsof ).

В следующем столбце указан тип файла. Чаще других встречаются файлы одного из следующих типов: REG - обычный файл, DIR - каталог, BLK - файл блочного устройства, CHR - файл символьного устройства, LINK - файл символической ссылки, INET – Internet-сокет, UNIX – доменный сокет UNIX. Но на справочной странице список типов гораздо обширнее.

Вслед за типом указывается устройство, на котором расположен файл, размер файла, номер индексного дескриптора и имя файла.

Опции команды

Поскольку просматривать вывод команды lsof, запущенной без параметров, достаточно неудобно, можно сократить объем выдаваемых данных, конкретизировав ваш запрос, что достигается за счет использования опций. Опций у этой утилиты довольно много и большинство из них действует по принципу ограничения вывода. Если вы указываете, например, опцию -U, то будут выведены только данные о сокетах UNIX, а все другие файлы игнорируются. Если указать две или более опций, то их действие определяется правилом ИЛИ, то есть выводится информация, определяемая каждой из опций. Например, команда

/usr/sbin/lsof -U -u kos

выдаст данные о всех открытых UNIX-сокетах и всех файлах, принадлежащих процессам, запущенным пользователем “kos”.

Если же необходимо скомбинировать действие опций по принципу логического И, то это делается путем специальной опции -a. Например, команда

/usr/sbin/lsof -a -U -u kos

выдаст список только сокетов UNIX, принадлежащих процессам, владельцем которых является пользователь “kos”'. Обратите внимание на то, что опция -a стоит не между объединяемыми ею другими опциями. Впрочем, ее можно ставить где угодно, все равно все перечисленные в командной строке опции будут работать по принципу “логическое И”.

Но если указывается, например, несколько однотипных опций, то вначале к ним применяется операция логического ИЛИ, а затем уже работает опция -a. Пример: по команде

/usr/sbin/lsof -i@aaa.bbb -i@ccc.ddd -a -ufff,ggg

будет выведен список файлов, принадлежащих ЛИБО пользователю “fff”, ЛИБО пользователю “ggg” И имеющих сетевые соединения ЛИБО к хосту aaa.bbb ЛИБО к хосту ccc.ddd.

Опции команды lsof можно записывать одну за другой без пробелов, предваряя это список всего одним дефисом, то есть вместо

/usr/sbin/lsof -a -b -C

можно указать просто

Однако при этом надо побеспокоиться о том, чтобы не было неоднозначности в интерпретации опций. Но я не буду детально рассматривать возможные причины неоднозначности, если у вас возникает желание использовать эту возможность, смотрите соответствующую man-страницу.

в выводе lsof будет присутствовать идентификатор процесса (p), имя команды (c), файловый дескриптор (f) и ися файла.

Применение команды lsof

Не имеет смысла повторять в статье описание всех опций этой команды, имеющееся на страничке man. Давайте ограничимся тем, что рассмотрим ее применение и использование наиболее употребительных опций на примерах конкретных ситуаций.

Пример 1. Кто работает с файлом или каталогом?

Как видите, сразу становится ясно, что дисковод используется пользователем kos, причем, видимо, какой-то подкаталог каталога /mnt/cdrom открыт в одной из панелей файлового менеджера Mifnight Commander (mc).

Надо отметить, что при использовании опции +d dir выдается информация только о тех файлах и подкаталогах, которые содержатся в самом каталоге dir, а не в его подкаталогах. Для решения рассматриваемой проблемы этого вполне достаточно, потому что если обычно в выводе команды указан и файл данного каталога. Но, если вы все же захотите получить список всех открытых файлов во всех вложенных подкаталогах каталога dir, надо воспользоваться опцией +D. Попробуем, например, посмотреть, какие файлы открыты в каталоге /var/ и всех его подкаталогах. В работающей системе всегда найдутся открытые файлы из этого каталога, поэтому на этом примере очень наглядно демонстрируется разница между опциями +d и +D:

(Упомяну для точности, что символические ссылки игнорируются и поэтому в выводе этой команды не перечисляются.)

Если вы почему либо хотите указать не имя каталога или файла, а номер файлового дескриптора, вы можете воспользоваться командой lsof -f fd, где fd есть список файловых дескрипторов, разделенных запятыми. В списке можно использовать диапазоны: 1-3,5 и те буквенные сочетания, которые были упомянуты выше, например, cwd,ltx,mem.

Между прочим, когда я экспериментировал с командой lsof , выяснилось, что файловый менеджер Konqueror не “держит” устройство: несмотря на то, что в Konqueror открыт каталог, расположенный на примонтированном CD, операция размонтирования устройства выполняется без проблем. По-видимому, Konqueror (как, вероятно, и другие браузеры) скачивает файл и закрывает соединение (файл).

Пример 2. Какой процесс использует данный файл?

Приведенный пример очень похож на предыдущий, только вы получаете сведения о процессах, использующих конкретный файл.

Пример 3. Какие ресурсы использует процесс?

Вы уже видели в листинге 1, что каждый процесс открывает несколько файлов. Но когда я выполнил команду

я был поражен тем, как много файлов открыто этим процессом. Впрочем, я привел этот пример не для того, чтобы сообщить о своем удивлении. Это пример просто иллюстрирует применение опции - с string в команде lsof. Запущенная с этой опцией lsof выводит список файлов, отрытых процессами, выполняющими команды, название которых начинается строкой string (один или несколько символов).

Но строка string может соответствовать нескольким запущенным в данный момент командам. Если вы хотите конкретизировать ваш запрос, вы можете воспользоваться другой опцией: -p pid. Например:

Команда lsof -p pid выводит список файлов, открытых процессами, чьи идентификаторы (PID) находятся в списке pid, например, “3593” или “823,451” (отдельные идентификаторы разделяются запятыми, пробелы в списке недопустимы). С помощью этой команды вы сможете увидеть, например, какие библиотеки используются процессом. Номер нужного PID можно извлечь из результатов выполнения команды /usr/sbin/lsof -c string.

Аналогичным образом можно вывести список файлов, открытых процессами, чьи идентификаторы группы (PGID) находятся в разделенном запятыми списке gid. Это позволяет сделать команда lsof -g gid .

Пример 4. С какими файлами работает пользователь?

Следующий вариант запуска той же команды:

позволяет вывести список файлов, открытых всеми процессами, запущенными пользователями, чье имя или идентификатор содержится в списке names. Отдельные элементы списка разделяются запятыми, например, ”548,root” (пробелов быть не должно).

Пример 5. Кто подключился к вашему компьютеру?

Команда lsof очень полезна в том случае, когда вы хотите обеспечить безопасность работы вашего компьютера в сети. С ее помощью вы можете определить, какие порты открыты для приема входящих соединений и какая программа прослушивает каждый порт. После это можно закрыть ненужные порты, чтобы минимизировать риск проникновения в систему злоумышленника. Для того, чтобы узнать, какие процессы в данный момент прослушивают сетевые соединения, воспользуйтесь командой lsof с опцией -i :

На листинге 2 показан результат выполнения этой команды на компьютере trend в моей домашней сети, состоящей всего из двух компьютеров.

Порты, которые открыты для входящих соединений, обозначены меткой LISTEN. Метка ESTABLISHED показывает, что по данному порту соединение установлено. В листинге 2 вы можете видеть пример двух SSH-сессий. Первая сессия установлена хостом old-lin.home.kos с компьютером trend.home.kos. Она обслуживается процессом с PID 2192, который был порожден основным демоном sshd, PID 727. Процесс с PID 2464, наоборот, соответствует соединению, установленному клиентской программой ssh на компьютере trend.

Поскольку и в этом случае количество информации, выдаваемой командой lsof с опцией -i может оказаться очень велико, можно конкретизировать запрос. Для этого нужно использовать команду в следующем формате:

где после опции -i указывается еще параметр – интересующий вас порт, сервис или имя хоста. В общем случае параметр adress задается в следующем виде (квадратные скобки обозначают необязательность каждой части параметра):

Здесь “46” обозначает версию протокола IP. Цифру 6 можно указывать только в том случае, если ваше ядро поддерживает IPv6. Если не указано ни 4, ни 6, будут рассматриваться соединения по тому и другому варианту протокола. Задавать версию протокола можно указывая опцию в форме -i4 -i6 (это то же самое, что и указать просто -i). Если указывается только версия IP-протокола без указания других частей параметра address, отображаются только данные о тех процессах и файлах, которые работают по соответствующему протоколу.

Вместо “protocol” в параметре может стоять либо TCP, либо UDP (либо ничего).

“hostname” - имя хоста, а “hostaddr” - числовой адрес. В случае протокола IPv4 эта часть задается в форме десятично-точечной записи, в случае IPv6 – в форме чисел, разделенных двоеточиями и заключенных в скобки.

“service” - это название одного из сервисов, например, smtp, или список таких сервисов.

“port” - это номер порта или список таких номеров.

Чтобы сказанное стало понятнее, приведем несколько простых примеров.

В этом случае будет выдан список всех процессов, прослушивающих или установивших соединение через порт 80.

В этом примере будут перечислены все соединения, ассоциированные с почтовым протоколом SMTP.

Очевидно, что указание параметра adress полезно только в том случае, когда вы заранее знаете, что именно вам нужно искать. Вы можете таким образом проверить, например, что какой-то конкретный сервис фактически работает и какой порт он прослушивает. Вы можете увидеть, подключился ли кто-то извне к вашему компьютеру по таким протоколам как SSH, Telnet, FTP или другим возможным способом.

Пример 6. Кто открыл файлы по NFS?

Если вы хотите узнать, открыты ли какие-то файлы, предоставленные удаленным пользователям по протоколу NFS, используйте опцию -N.

Пример 7. Наблюдаем за процессом копирования

Предположим, что вы решили переместить из одного каталога в другой большое количество файлов (или большой каталог целиком). И вы хотите видеть, какой именно файл перемещается в данный момент. Тут вам и может помочь утилита lsof. Для этого достаточно дать команду примерно такого вида (в этом примере предполагается, что перемещаются куда-то файлы из каталога Photo):

При этом нужно иметь в виду, что команда lsof делает как-бы “мгновенный снимок”, отображающий только лишь состояние процессов и соответствующих файлов в момент ее выполнения. Так что для “наблюдения за процессом” надо повторять ее запуск многократно. И в таком случае может оказаться полезной опция +r, которая служит для периодического повторения запуска команды через заданный промежуток времени.

Заключение

Мы рассмотрели только малую часть возможностей этой утилиты. Более подробную информацию ищите на соответствующей man-страничке.

Чрезмерная нагрузка на диск может быть вызвана такой причиной как заражение вирусом либо неправильная настройка программ. В любом случае, необходимо начать с идентификации процесса (программы), которая больше всего делает операций чтения и записи на диск.

iotop — аналог top для отслеживания нагрузки на диск в реальном времени

Программа top позволяет увидеть, какие процессы потребляют больше всего процессорного времени и оперативной памяти, но ничего не говорит об использовании процессами диска, об операциях чтения и записи на диск.

Программа iotop показывает скорость чтения и записи на диск, также процент использования файла подкачки каждым процессом.

Для установки iotop в Debian, Linux Mint, Kali Linux, Ubuntu и их производные выполните команду:

Для установки iotop в Arch Linux, BlackArch, Manjaro и их производные выполните команду:

Программа требует повышенных привилегий для запуска:


В выводе программы присутствуют следующие столбцы:

  • TID — идентификатор процесс
  • PRIO — приоритет процесса
  • USER — пользователь, который является владельцем процесса
  • DISK READ — скорость чтения диска
  • DISK WRITE — скорость записи на диск
  • SWAPIN — процент использования файла подкачки
  • IO> — процент от всех операций ввода-вывода
  • COMMAND — запустившая процесс команда

С помощью курсорных клавиш вправо (→) и влево (←) вы можете переключаться между столбцами, одновременно выбирая, по какому из них будет выполнятся сортировка.


С помощью кнопок «Home» и «End» вы можете переключаться между крайними столбцами.

Нажатие любой клавиши обновит окно.

Для выхода нажмите «q».

Нажав клавишу «o» вы переключитесь на показ только активных процессов, то есть только процессов, которые записывают и считывают данные с постоянного хранилища. Такой же результат вы можете получить запустив программу с опцией -o:

Повторное нажатие клавиши «o» вернёт показ всех процессов.

По умолчанию используется сортировка по убыванию, с помощью кнопки «r» вы можете переключаться между сортировкой по убыванию и по возрастанию.

Кнопка «p» переключает между показами процессов и потоков.

По умолчанию показываются скорости чтения и записи, с помощью кнопки «a» вы можете переключиться на показ общего количества записанных и прочитанных данных.


pidstat — вывод статистики для задач Linux

Пакет sysstat содержит сразу две утилиты с помощью которых можно собрать статистику использования диска процессами:

Для установки pidstat в Debian, Linux Mint, Kali Linux, Ubuntu и их производные выполните команду:

Для установки pidstat в Arch Linux, BlackArch, Manjaro и их производные выполните команду:

Следующая команда будет выводить накопленную статистику за каждые 20 секунд, будут показаны только активные процессы (сделавшие операции чтения и записи на диск за указанный интервал), также будет показана полная команда, запустившая процесс. Для более полной статистики запустите программу с повышенными привилегиями:


Каждая строка будет иметь следующие столбцы:

  • Метка времени
  • UID — числовой идентификатор пользователя
  • PID — идентификатор процесса
  • kB_rd/s — количество килобайт в секунду которые были прочитаны по инициативе указанной задачи
  • kB_wr/s — количество килобайт в секунду которые были (или должны были быть) записаны по инициативе указанной задачи
  • kB_ccwr/s — количество килобайт, запись которых на диск была отменена задачей. Это может произойти, когда задача усекает грязный кэш страниц. В этом случае некоторые операции ввода-вывода, для которых была учтена другая задача, не будут выполняться
  • iodelay — задержка ввода-вывода
  • Command — команда, запустившая задачу

iostat — статистика использования устройств и разделов дисков

Утилита iostat также включена в пакет sysstat. Как можно догадаться из названия программы, она создаёт отчёты по статистике ввода/вывода для устройств и разделов. Её особенностью является то, что она показывает обобщённую статистику для всей системы, а также для отдельных носителей, не разбивая её на процессы. Программа iostat может пригодиться когда необходимо ответить на вопрос: «какой из постоянных носителей подвергается наибольшей нагрузке?».

Запуск программы без опций

выведет два блока информации:

  • отчёт по использованию ЦПУ
  • отчёт по использованию устройств


Раздел со статистикой использований устройств содержит следующие разделы:

  • Device — имя устройства или раздела, как оно указано в /dev
  • tps — указывает количество передач в секунду, отправленных на устройство. Передача — это запрос ввода-вывода к устройству. Несколько логических запросов можно объединить в один запрос ввода-вывода к устройству. Размер перевода является неопределённой величиной
  • kB_read/s — указывает объём данных, считанных с устройства, выраженный в количестве блоков (килобайт, мегабайт) в секунду. Блоки эквивалентны секторам и поэтому имеют размер 512 байт
  • kB_wrtn/s — указывает объём данных, записываемых на устройство, выраженный в количестве блоков (килобайт, мегабайт) в секунду
  • kB_dscd/s — указывает количество данных, отбрасываемых устройством, выраженное в количестве блоков (килобайт, мегабайт) в секунду
  • kB_read — общее количество прочитанных блоков (килобайт, мегабайт)
  • kB_wrtn — общее количество записанных блоков (килобайт, мегабайт)
  • kB_dscd — общее количество отброшенных блоков (килобайт, мегабайт)

Отчёт выводит для всей системы с момента её загрузки.

Поскольку по умолчанию данные выводятся в килобайтах, а современные объёмы информации, записываемой на диск, обычно кратны гигабайтом, что цифры трудны для восприятия. Для вывода чисел в удобных для восприятия единицах используйте опцию -h:


Опция -h является эквивалентом указания сразу двух опций --human и --pretty, поэтому если вы не в полной мере довольны видом выводимого отчёта, то попробуйте использовать эти опции по отдельности.

Для вывода максимальной полной информации, укажите опцию -x:

Если вам нужна информация только об устройствах, то используйте опцию -d:

Вы можете запустить команду указав время интервала (в секундах) и счётчик (количество отчётов) — в этом случае программа будет выводить информацию через заданный интервал:

Первый отчёт будет содержать информацию с момента загрузки системы, а последующие отчёты будут содержать информацию за период, прошедший с предыдущего отчёта.

Для поиска проблем, вы можете использовать следующую команду, которая непрерывно будет выводить информацию:

С помощью iostat вы можете следить за скоростью чтения и записи на всё устройство, а также выявлять отброшенные блоки.

Linux: какой процесс вызывает "устройство занято" при выполнении umount?

посмотреть lsof command (список открытых файлов) -- он может сказать вам, какие процессы держат что открыто. Иногда это сложно, но часто что-то просто sudo lsof | grep (your device name here) может сделать это за вас.

на всякий случай. иногда случается, что вы вызываете umount из терминала, и ваш текущий каталог принадлежит смонтированной файловой системе.

вы должны использовать .

например. fuser /dev/cdrom вернет PID(ы) процесса, используя /dev/cdrom .

если вы пытаетесь размонтировать, вы можете убить процесс тезисов с помощью -k (см. man fuser ).

Проверьте устройства с открытым циклом, сопоставленные с файлом в файловой системе с помощью "losetup-a". Они не появятся ни с lsof, ни с fuser.

также проверить /etc/exports . Если вы экспортируете пути внутри точки монтирования через NFS, это даст эту ошибку при попытке размонтировать, и ничего не появится в fuser или lsof .

(as перечисляет процессы, использующие файлы на монтируемой точке монтирования. Особенно полезно для поиска того, какой процесс (ы) использует установленный USB-накопитель или CD/DVD.

lsof и fuser действительно два способа найти процесс, который держит определенный файл открытым. Если вы просто хотите, чтобы umount преуспел, вы должны изучить его-f и-l варианты.

именно поэтому существует" fuser-m /mount/point".

кстати, я не думаю, что" fuser "или" lsof " будут указывать, когда ресурс удерживается модулем ядра, хотя у меня обычно нет этой проблемы..

lsof и fuser тоже ничего мне не дали.

после процесса переименования всех возможных каталогов .старый и перезагрузка системы каждый раз после внесения изменений я нашел один конкретный каталог (относящийся к postfix), который был ответственным.

оказалось, что я когда-то сделал символическую ссылку из /var/spool/postfix на /disk2/pers/mail/postfix/varspool, чтобы минимизировать записи на диске в корневой файловой системе на основе SDCARD (Sheeva Plug).

С эта символическая ссылка, даже после остановки служб postfix и dovecot (как ps aux, так и netstat-tuanp не показали ничего связанного), я не смог отключить /disk2/pers.

когда я удалил символическую ссылку и обновил файлы конфигурации postfix и dovecot, чтобы указать непосредственно на новые dirs на /disk2/pers/, я смог успешно остановить службы и размонтировать каталог.

в следующий раз я буду более внимательно на выходе:

выше команда рекурсивно перечислит все символические ссылки в дереве каталогов (здесь, начиная с /var) и отфильтрует те имена, которые указывают на определенную целевую точку монтирования (здесь disk2).

открыть файлы

процессы с открытыми файлами являются обычные преступники. Покажите их:

есть преимущество в использовании /dev/<device> , а не /mountpoint : точка монтирования исчезнет после umount -l , или он может быть скрыт накладным креплением.

fuser также можно использовать, но на мой взгляд lsof имеет более полезный выход. Однако fuser полезно, когда дело доходит до убийства процессов, вызывая сцены так что вы можете получить с вашей жизнь.

список файлов на <mountpoint> (см. пример выше):

интерактивно убивать только процессы с открытыми для записи файлами:

после переустановки только для чтения ( mount -o remount,ro <mountpoint> ), безопасно (r) убить все остальные процессы:

Mountpoints

виновником может быть само ядро. Другая файловая система, смонтированная в файловой системе, которую вы пытаетесь umount вызовет скорбь. Проверять с:

для петлевых креплений также проверьте выход:

анонимные коды (Linux)

  • временные файлы ( open С O_TMPFILE )
  • inotify часы
  • [eventfd]
  • [eventpoll]
  • [timerfd]

это самый неуловимый тип покемонов, и появиться в lsof ' s как a_inode (который недокументирован в lsof man page).

они не появятся в lsof +f -- /dev/<device> , так что вам потребуется:

для процессов убийства, содержащих анонимные индексы, см.:список текущих часов inotify (путь, PID).

если вы все еще не можете размонтировать или перемонтировать устройство после остановки всех служб и процессов с открытыми файлами, то может быть файл подкачки или раздел подкачки, сохраняя устройство занято. Это не будет отображаться с fuser или lsof . Выключите замену с помощью:

вы можете проверить заранее и показать сводку любых разделов подкачки или файлов подкачки с:

в качестве альтернативы, используя команду sudo swapoff -a , вы также можно отключить своп, остановив службу или systemd в единица. Например:

в моем случае выключение swap было необходимо, в дополнение к остановке любых служб и процессов с открытыми для записи файлами, чтобы я мог переустановить свой корневой раздел только для чтения, чтобы запустить fsck на моем корневом разделе без перезагрузки. Это было необходимо на Raspberry Pi под управлением Raspbian Jessie.

файловые системы, смонтированные в файловой системе, которую вы пытаетесь размонтировать, могут вызвать target is busy ошибка в дополнение к любым файлам, которые используются. (Например, когда вы mount -o bind /dev /mnt/yourmount/dev чтобы использовать chroot там.)

чтобы найти, какие файловые системы монтируются в файловой системе, выполните следующие действия:

mount | grep '/mnt/yourmount'

чтобы найти, какие файлы используются советы, уже предложенные другими здесь:

Читайте также: