Количество открытых файлов Linux
Обновлено: 21.11.2024
Есть ли какая-либо конкретная команда или инструмент для подсчета количества открытых файлов пользователем в Linux?
2 ответа 2
lsof -u username вернет все открытые файлы для пользователя. Если вы передадите результат команде wc, у вас будет необходимое количество. Итак, если имя пользователя пользователя test
lsof -u тест | туалет -l
Я нашел эту старую статью и выполнил команду «lsof | grep ' user ' | awk '' | sort | wc -l», как она говорит. Но вывод (280000) сильно отличается от вывода (2000) вашей команды для того же пользователя. Есть причина для этого?
Какое имя пользователя у вашего пользователя? если имя пользователя, например, команда lsof | grep a будет соответствовать всем строкам, в которых есть a, поэтому результат будет неправильным.
Имя пользователя одинаково для обеих команд. Я использовал lsof | grep 'корень' | awk '
Команда grep не вернет точных результатов, поскольку она будет соответствовать большему количеству результатов, содержащих «имя пользователя». Например, он будет соответствовать всем файлам /proc/*/root. если вы хотите использовать другую команду, вы можете использовать lsof | тр -с '' | вырезать -d '' -f3 | grep имя пользователя | туалет -l
вы можете использовать lsof. эта команда предназначена для того, чтобы узнать, какие процессы в настоящее время открывают файл. если процесс открывает файл, записывает в него, а затем закрывает, вы можете использовать аудит.
-w наблюдать за etc/myprogram/cofig.ini -p warx следить за событиями записи, изменения атрибутов, выполнения или чтения -k config.ini-file — ключ поиска. дождитесь изменения файла, затем используйте
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками linux sysctl или задайте свой вопрос.
Связанные
Горячие вопросы о сети
Чтобы подписаться на этот RSS-канал, скопируйте и вставьте этот URL-адрес в программу для чтения RSS.
дизайн сайта / логотип © 2022 Stack Exchange Inc; вклады пользователей под лицензией cc by-sa. версия 2022.3.18.41718
В Linux вы можете изменить максимальное количество открытых файлов. Вы можете изменить это число с помощью команды ulimit. Он дает вам возможность контролировать ресурсы, доступные для оболочки или запускаемого ею процесса.
В этом кратком руководстве мы покажем вам, как проверить текущий лимит открытых файлов и описаний файлов, но для этого вам потребуется root-доступ к вашей системе.
Во-первых, давайте посмотрим, как мы можем узнать максимальное количество дескрипторов открытых файлов в вашей системе Linux.
Определить лимит открытых файлов в Linux
Значение хранится в:
Число, которое вы увидите, показывает количество файлов, которые пользователь может открыть за сеанс входа в систему. Результат может отличаться в зависимости от вашей системы.
Например, на моем сервере CentOS ограничение было установлено на 818 354, а на сервере Ubuntu, который я запускаю дома, ограничение по умолчанию было установлено на 176 772.
Если вы хотите увидеть жесткие и мягкие ограничения, вы можете использовать следующие команды:
Проверьте жесткое ограничение в Linux
Проверить мягкие ограничения в Linux
Чтобы увидеть жесткие и мягкие значения для разных пользователей, вы можете просто переключить пользователя с помощью «su» на пользователя, ограничения которого вы хотите проверить.
Как проверить ограничения системных файловых дескрипторов в Linux
Если вы используете сервер, для некоторых ваших приложений могут потребоваться более высокие ограничения для дескрипторов открытых файлов. Хорошим примером для этого являются службы MySQL/MariaDB или веб-сервер Apache.
Вы можете увеличить лимит открываемых файлов в Linux, отредактировав директиву ядра fs.file-max . Для этой цели вы можете использовать утилиту sysctl.
Например, чтобы увеличить лимит открытых файлов до 500 000, вы можете использовать следующую команду от имени пользователя root:
Вы можете проверить текущее значение для открытых файлов с помощью следующей команды:
С помощью приведенной выше команды внесенные вами изменения останутся активными только до следующей перезагрузки. Если вы хотите применить их постоянно, вам придется отредактировать следующий файл:
Добавьте следующую строку:
Конечно, вы можете изменить номер в соответствии с вашими потребностями. Чтобы снова проверить изменения, используйте:
Чтобы изменения вступили в силу, пользователям потребуется выйти и снова войти в систему. Если вы хотите применить ограничение немедленно, вы можете использовать следующую команду:
Установить ограничения на открытие файлов на уровне пользователя в Linux
В приведенных выше примерах показано, как устанавливать глобальные ограничения, но вы можете применить ограничения для каждого пользователя. Для этого от имени пользователя root вам потребуется отредактировать следующий файл:
Если вы являетесь администратором Linux, я предлагаю вам хорошо изучить этот файл и то, что вы можете с ним сделать. Прочитайте все комментарии в нем, так как он обеспечивает большую гибкость в плане управления системными ресурсами, ограничивая пользователей/группы на разных уровнях.
Строки, которые вы должны добавить, имеют следующие параметры:
Вот пример установки мягкого и жесткого ограничений для пользователя marin:
Заключительные мысли
В этой краткой статье показан базовый пример того, как можно проверить и настроить глобальные ограничения и ограничения на уровне пользователя для максимального количества открытых файлов.
Несмотря на то, что мы только коснулись поверхности, я настоятельно рекомендую вам более подробно ознакомиться с файлами /etc/sysctl.conf и /etc/security/limits.conf и узнать, как их использовать. Когда-нибудь они вам очень пригодятся.
Если вам понравилась эта статья, подпишитесь на уведомления по электронной почте о руководствах по Linux. Если у вас есть вопросы или сомнения? обратитесь за помощью в разделе комментариев.
Если вы цените то, что мы делаем здесь, в TecMint, вам следует подумать о следующем:
TecMint – это самый быстрорастущий и пользующийся наибольшим доверием сайт сообщества, где можно найти любые статьи, руководства и книги по Linux в Интернете. Миллионы людей посещают TecMint! для поиска или просмотра тысяч опубликованных статей, доступных всем БЕСПЛАТНО.
Если вам нравится то, что вы читаете, купите нам кофе (или 2) в знак признательности.
Мы благодарны за вашу бесконечную поддержку.
Похожие сообщения
7 мыслей о «Как увеличить лимит количества открытых файлов в Linux»
Кто-нибудь знает, как должен называться «файл» в /user/lib/sysctl.d/** , как упоминал Идир?
Спасибо за информацию.
После внесения изменений в /etc/security/limits.conf и перезапуска процесса я вижу, что количество открытых файлов в /proc//limits не изменилось. Что еще нужно изменить, чтобы изменения отразились здесь.
Привет,
Какой должен быть предел открытия файла, если системная оперативная память составляет 8 ГБ? Также хотелось бы знать, как рассчитать это?
У нас Ubuntu 12.04 с 8 ГБ оперативной памяти. Я оставляю, что нам нужно учитывать системную оперативную память перед изменением предела.
Мой вопрос: почему в Linux существует ограничение на количество открытых файлов?
Ну, ограничения процессов и файлов важны, поэтому такие вещи, как форк-бомбы, не ломают сервер/компьютер для всех пользователей, а только для пользователя, который это делает, и только временно. В противном случае кто-то на общем сервере может запустить вилочную бомбу и полностью вывести из строя всех пользователей, а не только себя.
@Rob, форк-бомба не имеет к этому никакого отношения, так как ограничение на количество файлов определяется для каждого процесса, и каждый раз, когда вы создаете форк, он не открывает новый дескриптор файла.
3 ответа 3
Причина в том, что операционной системе требуется память для управления каждым открытым файлом, а память — ограниченный ресурс, особенно во встроенных системах.
Как привилегированный пользователь вы можете изменить максимальное количество открытых файлов для каждого процесса (с помощью ulimit -n ) и для каждой системы (например, echo 800000 > /proc/sys/fs/file-max ).
Есть также причина безопасности: если бы не было ограничений, пользовательское программное обеспечение могло бы создавать файлы бесконечно, пока сервер не выйдет из строя.
@Coren Обсуждаемые здесь ограничения касаются только количества обработчиков открытых файлов. Поскольку программа также может закрывать обработчики файлов, она может создавать столько файлов и любого размера, сколько захочет, пока все доступное дисковое пространство не будет заполнено. Чтобы предотвратить это, вы можете использовать дисковые квоты или отдельные разделы. Вы правы в том смысле, что одним из аспектов безопасности является предотвращение исчерпания ресурсов, и для этого есть ограничения.
@jofel Спасибо. Я предполагаю, что дескрипторы открытых файлов представлены экземплярами файла структуры, а размер этой структуры довольно мал (уровень байтов), поэтому я могу установить /. /file-max с довольно большим значением, пока память не израсходована?
@xanpeng Я не эксперт по ядру, но, насколько я понимаю, значением по умолчанию для file-max является размер ОЗУ, разделенный на 10 КБ.Поскольку реальная память, используемая обработчиком файла, должна быть намного меньше (размер файла структуры плюс некоторая память, зависящая от драйвера), это кажется довольно консервативным ограничением.
Максимальное значение, которое вы можете установить, равно 2^63-1: echo 9223372036854775807 > /proc/sys/fs/file-max . Не знаю, почему Linux использует целые числа со знаком.
Обратите внимание, что lsof | wc -l суммирует множество повторяющихся записей (разветвленные процессы могут совместно использовать дескрипторы файлов и т. д.). Это число может быть намного выше предела, установленного в /proc/sys/fs/file-max .
Чтобы получить текущее количество открытых файлов с точки зрения ядра Linux, сделайте следующее:
Пример: на этом сервере 40096 открытых файлов из максимальных 65536, хотя lsof сообщает гораздо большее число:
Поскольку lsof сообщит о многих файлах дважды или более, таких как /dev/null , вы можете попытаться угадать с помощью: lsof|awk '
Очень старый вопрос, но я изучил эти настройки на моем сервере и lsof | wc -l дает 40 000, в то время как номер файла говорит 2300 - это несоответствие нормально?
Я думаю, во многом это связано с историческими причинами.
Дескриптор файла Unix – это небольшое значение типа int, возвращаемое такими функциями, как open и creat, и передаваемое функциям read, write, close и т. д.
По крайней мере, в ранних версиях Unix дескриптор файла был просто индексом в массиве структур фиксированного размера для каждого процесса, где каждая структура содержит информацию об открытом файле. Если я правильно помню, некоторые ранние системы ограничивали размер этой таблицы до 20 или около того.
Более современные системы имеют более высокие пределы, но сохранили ту же общую схему, в основном по инерции.
20 было пределом Solaris для структур данных FILE языка C. Количество дескрипторов файлов всегда было больше.
@Lothar: Интересно. Интересно, почему пределы будут другими. Учитывая функции fileno и fdopen, я ожидаю, что они будут почти взаимозаменяемы.
Файл unix — это больше, чем просто возвращаемый дескриптор файла (int). Есть дисковые буферы и блок управления файлом, который определяет текущее смещение файла, владельца файла, разрешения, индексный дескриптор и т. д.
@ChuckCottril: Да, конечно. Но большая часть этой информации должна храниться независимо от того, осуществляется ли доступ к файлу через дескриптор int или через FILE* . Если у вас есть более 20 файлов, открытых с помощью open() , вызовет ли fdopen() ошибку?
Очень активный вопрос. Заработайте 10 репутации (не считая бонуса ассоциации), чтобы ответить на этот вопрос. Требование к репутации помогает защитить этот вопрос от спама и отсутствия ответа.
Возможно, вы слышали поговорку: «В Linux все является файлом». Хотя это не совсем так, в этом есть доля правды.
В Linux и Unix-подобных системах все похоже на файл. Это означает, что ресурсам в системе Unix назначается файловый дескриптор, включая устройства хранения, сетевые сокеты, процессы и т. д.
Дескриптор файла – это уникальный номер, идентифицирующий файл и другие устройства ввода/вывода. Он описывает ресурсы и то, как ядро обращается к ним. Думайте об этом как о шлюзе к аппаратным ресурсам абстракции ядра.
Это означает, что Unix и Unix-подобные системы, такие как Linux, интенсивно используют такие файлы. Опытному пользователю Linux невероятно полезно видеть открытые файлы, процессы и пользователей, которые их используют.
В этом учебном пособии основное внимание будет уделено способам просмотра открытых файлов и тому, какой процесс или пользователь отвечает за это.
Предварительные условия
Прежде чем мы начнем, убедитесь, что у вас есть:
Если они у вас есть, давайте начнем:
Утилита LSOF
Созданная Виктором Абеллом, List open files, сокращенно lsof, представляет собой утилиту командной строки, которая позволяет нам просматривать открытые файлы и процессы или пользователей, открывших их.
Утилита lsof доступна в основных дистрибутивах Linux; однако вы можете обнаружить, что он не установлен, и поэтому вам может потребоваться установить его вручную.
Как установить lsof в Debian/Ubuntu
Чтобы установить его в Debian, используйте команду:
sudo apt-получить обновление
sudo apt-get install lsof -y
Как установить на REHL/CentOS
Для установки на REHL и CentOS используйте команду:
обновление sudo dnf
sudo dnf установить lsof
Как установить на Arch
В Arch вызовите диспетчер пакетов с помощью команды:
sudo pacman -S lsof
Как установить в Fedora
В Fedora используйте команду:
После установки и обновления утилиты lsof мы можем начать ее использовать.
Основное использование
Чтобы использовать инструмент lsof, введите команду:
После того как вы выполните указанную выше команду, lsof выведет большое количество информации, как показано ниже:
Приведенный выше вывод показывает все файлы, открытые процессами. Вывод имеет различные столбцы, каждый из которых представляет определенную информацию о файле.
- Столбец COMMAND — показывает имя процесса, использующего файл.
- PID — показывает идентификатор процесса, использующего файл.
- TID – показывает идентификатор задачи (потоков) процесса.
- TASKCMD — представляет имя команды задачи.
- ПОЛЬЗОВАТЕЛЬ – владелец процесса.
- FD — показывает номер файлового дескриптора. Вот как процессы используют файл; параметры, доступные в этом столбце, включают:
- cwd — текущий рабочий каталог.
- mem – файл с отображением в памяти
- pd — родительский каталог
- jld — каталог тюрьмы
- ltx — текст общей библиотеки
- rtd — корневой каталог.
- txt — программный код и данные
- tr — файл трассировки ядра.
- err – ошибка информации о файловом дескрипторе.
- mmp – устройство с отображением памяти.
- TYPE — показывает тип узла, связанного с файлом, например:
- Unix — для сокета домена Unix.
- DIR — представляет каталог
- REG – представляет собой обычный файл.
- CHR — представляет файл специальных символов.
- ССЫЛКА – файл символической ссылки
- BLK – заблокировать специальный файл.
- INET — сокет домена Интернета
- FIFO – именованный канал (файл First In First Out)
- ТРУБА – для труб
- УСТРОЙСТВА — показывает номера устройств, разделенные запятыми, в порядке файла специальных символов, специального блока, обычного, каталога и файла NFS.
- SIZE/OFF — показывает размер файла по смещению файла в байтах.
- NODE – показывает номер узла локального файла, тип интернет-протокола и т. д.
- NAME — показывает имя точки монтирования и fs, на которой находится файл.
Примечание. Подробную информацию о столбцах см. в руководстве по lsof.
Как показать процессы, открывшие файл
Lsof предоставляет нам параметры, которые помогают фильтровать выходные данные, чтобы отображались только процессы, открывшие определенный файл.
Например, чтобы увидеть файл, открывший файл /bin/bash, используйте команду как:
Это даст вам вывод, как показано ниже:
КОМАНДА PID ПОЛЬЗОВАТЕЛЬ FD ТИП УСТРОЙСТВО РАЗМЕР / ВЫКЛ ИМЯ УЗЛА
ksmtuned 1025 root txt REG 253, 0 1150704 428303 /usr/bin/bash
bash 2968 centos txt REG 253, 0 1150704 428303 /usr/bin/bash
bash 3075 centos txt REG 253, 0 1150704 428303 /usr/bin/bash
Как показать файлы, открытые конкретным пользователем
Мы также можем отфильтровать вывод, чтобы показать файлы, открытые определенным пользователем. Мы делаем это, используя флаг -u, за которым следует имя пользователя:
Это даст вам вывод, как показано ниже:
Как показать файлы, открытые определенным процессом
Предположим, мы хотим просмотреть все файлы, открытые определенным процессом? Для этого мы можем использовать PID процесса для фильтрации вывода.
Например, приведенная ниже команда показывает файлы, открытые с помощью bash.
Это даст вам только файлы, открытые systemd, как показано:
Как показать файлы, открытые в каталоге
Чтобы открыть файлы в определенном каталоге, мы можем передать параметр +D, за которым следует путь к каталогу.
Например, список открытых файлов в каталоге /etc.
Ниже приведен вывод для этого:
Как показать сетевое подключение
Поскольку все в Linux является файлом, мы можем получить сетевые файлы, такие как файлы TCP или соединения.
Мы можем использовать команду:
Это даст вам TCP-соединения в системе.
Вы также можете фильтровать по конкретному порту, используя команду, показанную ниже:
Это даст вам вывод, как показано ниже:
Как постоянно показывать файлы
Lsof предоставляет нам режим для циклического вывода каждые несколько секунд. Это позволяет вам постоянно отслеживать файлы, открытые процессом или пользователем.
Однако этот вариант требует завершения процесса вручную.
Например, приведенная ниже команда постоянно отслеживает файлы, открытые на порту 22:
Как видите, в третьем цикле lsof перехватывает установленное соединение с сервером по SSH.
Заключение
Lsof — невероятно полезная утилита. Это позволяет вам отслеживать критические файлы, а также отслеживать пользователей и процессы, открывающие файлы.Это может быть невероятно полезно при устранении неполадок или поиске вредоносных попыток доступа к системе.
Как показано в этом руководстве, используя различные примеры и методы, вы можете комбинировать функции, предоставляемые инструментом lsof, для пользовательского мониторинга.
Спасибо, что прочитали и поделились! Надеюсь, вы узнали что-то новое!
Об авторе
Джон Отиено
Меня зовут Джон, и я такой же гик, как и вы. Я увлечен всеми вещами компьютеров от оборудования, операционных систем до программирования. Моя мечта — поделиться своими знаниями с миром и помочь другим гикам. Следите за моим контентом, подписавшись на список рассылки LinuxHint
Читайте также: