Вопрос или проблема
Мне нужна помощь в понимании, что такое открытый файл в Linux? Как еще называются открытые файлы в Linux? Являются ли открытые файлы и процессы одним и тем же в Linux? Есть ли разница между открытым файлом и обычным файлом в Linux?
$ lsof /run
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 31u FIFO 0,24 0t0 19314 /run/initctl
systemd 1 root 38u FIFO 0,24 0t0 19331 /run/dmeventd-server
systemd 1 root 39u FIFO 0,24 0t0 19332 /run/dmeventd-client
systemd-j 713 root mem REG 0,24 8388608 12871 /run/log/journal/aaff550ef54147ddb4d1776d86b04055/system.journal
NetworkMa 881 root 20w FIFO 0,24 0t0 24896 /run/systemd/inhibit/1.ref
rhsmcertd 906 root 3wW REG 0,24 0 22479 /run/lock/subsys/rhsmcertd
crond 910 root 3uW REG 0,24 4 24002 /run/crond.pid
rsyslogd 1224 root mem REG 0,24 8388608 12871 /run/log/journal/aaff550ef54147ddb4d1776d86b04055/system.journal
rsyslogd 1224 root 10r REG 0,24 8388608 12871 /run/log/journal/aaff550ef54147ddb4d1776d86b04055/system.journal
sshd 1651 root 11w FIFO 0,24 0t0 27390 /run/systemd/sessions/1.ref
sshd 1666 admin 11w FIFO 0,24 0t0 27390 /run/systemd/sessions/1.ref
В приведенном выше примере первый столбец показывает, какие процессы используют какие файлы в каталоге /run. Правильно ли я понимаю? Являются ли процессы (первый столбец) известными как открытые файлы, или регулярные файлы (последний столбец) известны как открытые файлы?
В следующем примере, 890=sshd
lsof -p 890
из многих строк в выводе, некоторые ниже
CMD PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 890 root txt REG 253,0 886344 646480 /usr/sbin/sshd
sshd 890 root mem REG 253,0 6940392 34389337 /var/lib/sss/mc/group
sshd 890 root mem REG 253,0 9253600 34389336 /var/lib/sss/mc/passwd
Итак, в приведенном выше примере, процесс sshd использует passwd, и passwd является одним из открытых файлов, верно?
Как CMD (команда) в первом столбце показывает процесс, а столбец NAME показывает команды (такие как passwd и т.п.)?
Можно ли вручную отредактировать открытый файл?
Являются ли открытые файлы и процессы одним и тем же в Linux?
Совершенно нет.
Хотя процесс всегда имеет ссылку на свой собственный файл (не файловый дескриптор, а отображение в память, которое lsof показывает как txt
). Но это не значит, что они одно и то же.
Являются ли процессы (первый столбец) известными как открытые файлы, или регулярные файлы (последний столбец) известны как открытые файлы?
Я бы сказал, что ни то, ни другое. Ссылки, удерживаемые процессами – файловые дескрипторы и тому подобное (четвертый столбец под названием FD
) – это и есть “открытые файлы”. Конечно, этот термин часто может относиться и к фактическому файлу, но файловые дескрипторы являются основным способом, с помощью которого программа удерживает что-то открытым, будь то файл, сокет или устройство. (В Windows та же концепция называется “handle”).
Суть в том, что когда программа открывает файл, это не меняет состояние или тип самого файла, а только создает файловый дескриптор (удерживаемый процессом), который ссылается на файл. Файл считается “открытым” до тех пор, пока какой-либо процесс удерживает для него файловый дескриптор, но при этом он остается обычным файлом.
Объекты, не являющиеся файлами, такие как каталоги или сокеты или каналы, также считаются “открытыми файлами”. Процесс может иметь несколько файловых дескрипторов, ссылающихся на один и тот же файл (или другой объект), и они обычно считаются различными “открытыми файлами” для большинства целей.
Как CMD (команда) в первом столбце показывает процесс, а столбец NAME показывает команды (такие как passwd и т.п.)?
/var/lib/sss/mc/passwd
– это не команда. Это совершенно не связанный файл, который просто имеет такое же название, как команда passwd
.
Но в этом отношении, сама команда passwd
берется из файла – это на самом деле /usr/bin/passwd
– и с ней можно работать как с любым другим файлом (например, как вы работали бы с .exe файлом в Windows). Для большинства программ нет необходимости это делать, но вы можете открыть /usr/bin/passwd в подходящей программе, и он тогда появится как ‘открытый файл’.
Ответ или решение
В мире Linux понимание терминологии, связанной с рабочими процессами и открытыми файлами, имеет важное значение для эффективного администрирования системы. Для начала разберём, что такое открытые файлы в Linux и как они отличаются от процессов.
Теория (Theory)
В Linux понятием "открытый файл" обычно обозначают любое файловое дескрипторное соединение, которое удерживается процессом в системе. Когда процесс открывает файл, система создает дескриптор файла — небольшое положительное целое число, которое служит указателем на этот файл. Этот дескриптор находится в контексте процесса и позволяет последнему выполнять операции ввода-вывода с соответствующим файлом. Термин "открытый файл" может как относиться к самим дескрипторам, так и к файловым объектам, доступ к которым осуществляется через эти дескрипторы.
Процессы в Linux, напротив, представляют собой работающие инстанции программ и имеют уникальные идентификаторы процесса (PID). Каждый процесс содержит различные ресурсы, такие как память и файловые дескрипторы, которые помогают им взаимодействовать с системной средой.
Пример (Example)
Рассмотрим вывод команды lsof
, которая позволяет получить информацию о том, какие процессы и какие файлы открыты в системе. Например, вывод ниже демонстрирует, как различные процессы (например, systemd
, sshd
) удерживают открытые файлы, такие как каналы (FIFO) или обычные файлы:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 31u FIFO 0,24 0t0 19314 /run/initctl
systemd 1 root 38u FIFO 0,24 0t0 19331 /run/dmeventd-server
...
sshd 1651 root 11w FIFO 0,24 0t0 27390 /run/systemd/sessions/1.ref
sshd 1666 admin 11w FIFO 0,24 0t0 27390 /run/systemd/sessions/1.ref
В первой колонке COMMAND
отображается команда, породившая процесс, в колонке PID
— его идентификатор, а столбец FD
обозначает открытые дескрипторы файла. Например, в данном случае sshd
открывает и использует файл /run/systemd/sessions/1.ref
через файловый дескриптор, указанный в колонке FD
.
В случае использования команды lsof -p 890
, которая отображает данные по конкретному процессу (sshd
) с PID 890, можно увидеть следующее:
CMD PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 890 root txt REG 253,0 886344 646480 /usr/sbin/sshd
sshd 890 root mem REG 253,0 6940392 34389337 /var/lib/sss/mc/group
Эти строки показывают, что процесс sshd
использует файл /usr/sbin/sshd
как исполняемый модуль (txt
указывает на то, что это текстовые сегменты), а также некоторые другие ресурсы в качестве памяти.
Применение (Application)
Практическое понимание того, что такое открытые файлы и как они связаны с процессами, помогает более эффективно управлять системой или отлаживать её работу. Например:
-
Управление ресурсами: Знание того, какие файлы открыты процессами, позволяет идентифицировать утечки ресурсов, такие как ненадлежащие закрытия файлов.
-
Отладка: Наблюдение за открытыми файлами помогает выявлять проблемы с программами, которые располагают некорректными разрешениями на файлы или пытаются получить доступ к несущестующим ресурсам.
-
Обеспечение безопасности: Мониторинг открытых файлов позволяет объективно оценить, какие процессы взаимодействуют с критически важными для системы данными, что важно для предотвращения несанкционированного доступа.
За счет управления открытыми файлами администраторы могут гарантировать стабильную и безопасную работу системы. Несмотря на некоторую схожесть в терминологии, "процессы" и "открытые файлы" в Linux принципиально различаются по своей природе и функциям в системе.