2016-12-09 12 views
1

Я проверяю, пустой ли файл в Shell. test -s /sys/fs/cgroup/systemd/docker/d4e311735706485e748513bad611070e223cba76fdf4c72a1102d14b653da750/tasks Он возвращает false, и я нашел его размер 0, когда я использую ls -lh, но когда я использую cat, я могу получить 4071 в этом файле, это означает, что файл не пуст. Я думаю, возможно, этот файл слишком мал, я создаю файл в своем домашнем каталоге и эхо 4071, я считаю, что его размер не равен 0. Является ли файл в/sys/fs/cgroup специальным?В linux файл не пуст, но размер 0

+0

не обязательно означает «в то же время» - может быть, файл написан и последовательно усечен? Это обычный файл, вы можете показать ls -l-вывод? –

+0

@Stefan Hegny Спасибо за ваш ответ, вот вывод ls -lh: '-rw-r - r-- 1 root root 0 Dec 11 15:47 tasks' Я думаю, что вы правы, этот файл, возможно, написан to and beingtruncated, этот файл записывает процессы в контейнере, и он обновляется все время. – cheon

+0

@ cheon По крайней мере, я уверен, что это не вопрос «слишком маленький». Больше нуля в компьютерном языке означает больше нуля, и нет другого «слишком малого» слоя ... –

ответ

1

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

Чтобы понять, почему это происходит, давайте посмотрим, что произойдет, когда вы сделаете 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 пусто.