Я проверяю, пустой ли файл в Shell. test -s /sys/fs/cgroup/systemd/docker/d4e311735706485e748513bad611070e223cba76fdf4c72a1102d14b653da750/tasks
Он возвращает false, и я нашел его размер 0, когда я использую ls -lh
, но когда я использую cat
, я могу получить 4071 в этом файле, это означает, что файл не пуст. Я думаю, возможно, этот файл слишком мал, я создаю файл в своем домашнем каталоге и эхо 4071, я считаю, что его размер не равен 0. Является ли файл в/sys/fs/cgroup специальным?В linux файл не пуст, но размер 0
ответ
Файл, в котором вы работаете, представляет собой специальный файл, который является частью файловой системы группы.
Чтобы понять, почему это происходит, давайте посмотрим, что произойдет, когда вы сделаете test -e $filename
.
Мы будем использовать команду strace
, которая печатает системные вызовы, которые выполняет команда.
Если вы strace test -e $filename
, вы найдете эту строку в результатах:
stat("$filename", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
В этом случае она возвращает st_size = 0
, который является размер файла.
Но вопросы то, что на самом деле происходит с другой стороны, внутри ядра:
При попытке иметь дело с файлом, вы системный вызов, который идет в промежуточный слой в ядре называется виртуальным файловую систему, которая, в свою очередь, вызывает часть ответственности за необходимую информацию. Системный вызов stat попытается получить статус из inode, соответствующего файлу. Файловая система может создавать и обрабатывать индексный дескриптор по своему усмотрению.
контрольной группе это специальный тип файловой системы, когда он добавляет файл (с помощью функции cgroup_add_file
, определенный в kernel/cgroup.c) всегда проходит размер от 0 до __kernfs_create_file
так, поэтому любой файл в/SYS/фс/контрольные группы (созданные контрольной группы фс) всегда будет иметь нулевой размер относительно фактического содержимого файла.
Для другой части, когда файл кот. Если вы strace cat $filename
, то есть то, что вы получите:
open("$filename", O_RDONLY) = 3
read(3, "...", 131072) = ###
Считанные будет проходить через виртуальную файловую систему в файл ядро системы и с помощью файловых операций, связанных с файлом, он получит вам необходимые данные.
Cgroup fs имеет функции для генерации данных в своих файлах. Это как tasks
файл определяется в kernel/cgroup.c
{
.name = "tasks",
.seq_start = cgroup_pidlist_start,
.seq_next = cgroup_pidlist_next,
.seq_stop = cgroup_pidlist_stop,
.seq_show = cgroup_pidlist_show,
.private = CGROUP_FILE_TASKS,
.write = cgroup_tasks_write,
},
Так seq_start, seq_next, seq_stop и seq_show являются функции, ответственные за генерацию информации, необходимой для файла. Вы можете легко перейти на kernel/cgroups.c и проверить, что они делают.
Обратите внимание, что если вы пытаетесь узнать, есть ли у cgroup задачи, проще использовать уведомление при выпуске.
из Documentation/cgroup-v1/cgroups.txt
Если флаг notify_on_release включен (1) в контрольной группе, тогда, когда последняя задача в контрольной группе листьев (выходит или присоединяется к какой-либо другой контрольной группы), а последний ребенок контрольная группа этого cgroup удаляется, тогда ядро запускает команду, указанную содержимым файла «release_агент» в корневом каталоге этой иерархии, поставляя имя пути (относительно точки монтирования файловой системы группы) заброшенной группы. Это позволяет автоматически удалять заброшенные группы. Значение по умолчанию notify_on_release в корневой группе при загрузке системы отключено (0). Значением по умолчанию других групп при создании является текущее значение настроек notify_on_release их родителей. Значение по умолчанию для пути release_агента иерархии cgroup пусто.
не обязательно означает «в то же время» - может быть, файл написан и последовательно усечен? Это обычный файл, вы можете показать ls -l-вывод? –
@Stefan Hegny Спасибо за ваш ответ, вот вывод ls -lh: '-rw-r - r-- 1 root root 0 Dec 11 15:47 tasks' Я думаю, что вы правы, этот файл, возможно, написан to and beingtruncated, этот файл записывает процессы в контейнере, и он обновляется все время. – cheon
@ cheon По крайней мере, я уверен, что это не вопрос «слишком маленький». Больше нуля в компьютерном языке означает больше нуля, и нет другого «слишком малого» слоя ... –