Сделать strace
из tail -f
, это все объясняет. Интересная часть:
13791 fstat(3, {st_mode=S_IFREG|0644, st_size=139, ...}) = 0
13791 fstatfs(3, {...}) = 0
13791 inotify_init() = 4
13791 inotify_add_watch(4, "/path/to/file", IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 1
13791 fstat(3, {st_mode=S_IFREG|0644, st_size=139, ...}) = 0
13791 read(4, 0xd981c0, 26) = -1 EINTR (Interrupted system call)
Что оно делает? Он устанавливает inotify
обработчик для файла, а затем ждет, пока что-то произойдет с этим файлом. Если ядро сообщает tail
через этот обработчик inotify, что файл изменился (обычно был добавлен), то tail
1) ищет 2) читает изменения 3) записывает их на экран.
/proc/3844/fd/1
В вашей системе есть символическая ссылка /dev/pts/14
, которая является символьным устройством. Не существует такой вещи, как «карта памяти», к которой можно получить доступ. Таким образом, нет ничего, чьи изменения могли бы быть подписаны в inotify, потому что нет диска или области памяти, к которой можно было бы получить доступ.
Это символьное устройство представляет собой виртуальный терминал, который практически работает как сетевой сокет. Программы, запущенные на этом виртуальном терминале, подключаются к этому устройству (как если бы вы подключились по tcp-порту) и записывали то, что они хотят записать. Также есть более сложные вещи, например, блокировка экрана, последовательности управления терминалом и т. Д., Которые обычно обрабатываются ioctl()
вызовами.
Я думаю, вы хотите как-то посмотреть виртуальный терминал. Это может быть сделано в Linux, но это не так просто, для этого требуются некоторые функции, подобные сетевому прокси, и немного хитрое использование этих ioctl()
вызовов. Но есть инструменты, которые могут это сделать.
В настоящее время я не могу вспомнить, в каком пакете Debian есть инструмент для этой цели, но, немного погуглив, вы можете легко найти это.
Расширение: как @Jajesh упомянул здесь (дайте ему +1, если вы дали мне), инструмент назван watch
.
Расширение №2: упомянутое @kelnos, простого cat /dev/pts/14
было тоже достаточно. Я пробовал это, и да, это работало, но не правильно. Я не много экспериментировал с этим, но мне кажется, что выход, поступающий в этот виртуальный терминал, поступает либо в cat
команду, либо в исходное местоположение, а не в оба. Но это не точно.