Зробити 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
, що є пристроєм символів. Немає такого, як деякі, як "карта пам'яті", до якої можна було б отримати доступ. Таким чином, немає нічого, чиї зміни можна було б підписати до інотифікованого, оскільки немає диска чи області пам'яті, до якої можна було б отримати доступ.
Цей символьний пристрій - це віртуальний термінал, який практично працює так, ніби це мережевий сокет. Програми, що працюють на цьому віртуальному терміналі, підключаються до цього пристрою (так само, як ніби ви telnet-тед в порт tcp) і записуєте те, що хочуть записати. Є і складніші речі, наприклад, блокування екрана, послідовності управління терміналом і таке, як правило, обробляються ioctl()
дзвінками.
Я думаю, ви хочете якось дивитись віртуальний термінал. Це можна зробити на Linux, але це не так просто, йому потрібен певний функціонал мережевого проксі, і трохи хитро використання цих ioctl()
дзвінків. Але є інструменти, які можуть це зробити.
В даний час я не можу пригадати, який пакет debian має інструмент для досягнення цієї мети, але з невеликим поглинанням ви могли це знайти, мабуть, легко.
Розширення: як згадується тут @Jajesh (дайте йому +1, якщо ви дали мені), інструмент названий watch
.
Розширення №2: Згаданий @kelnos, досить cat /dev/pts/14
було також простого . Я спробував це, і так, це спрацювало, але не правильно. Я з цим не експериментував багато, але мені здається, що вихід, що надходить у цей віртуальний термінал, перейшов або до cat
команди, або до його вихідного місця, і ніколи до обох. Але це не точно.