Zrób strace
z tail -f
, to wszystko wyjaśnia. Interesująca część:
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)
Co to robi? Ustawia inotify
moduł obsługi pliku, a następnie czeka, aż coś się stanie z tym plikiem. Jeśli jądro mówi tail
przez ten moduł obsługi inotify, że plik zmienił się (normalnie został dołączony), to tail
1) szuka 2) odczytuje zmiany 3) zapisuje je na ekranie.
/proc/3844/fd/1
w twoim systemie jest dowiązanie symboliczne /dev/pts/14
, które jest urządzeniem znakowym. Nie ma czegoś takiego jak „mapa pamięci”, do której można uzyskać dostęp. Tak więc nie ma nic, którego zmiany mogłyby zostać podpisane w inotify, ponieważ nie ma obszaru dysku ani pamięci, do którego można by uzyskać dostęp.
To urządzenie postaci jest wirtualnym terminalem, który praktycznie działa tak, jakby był gniazdem sieciowym. Programy działające na tym wirtualnym terminalu łączą się z tym urządzeniem (tak jakbyś telnet-ted do portu tcp) i zapisywał, w co chcą pisać. Są też rzeczy bardziej złożone, na przykład blokowanie ekranu, sekwencje kontrolne terminali i takie są zwykle obsługiwane przez ioctl()
połączenia.
Myślę, że chcesz jakoś obejrzeć wirtualny terminal. Można to zrobić na Linuksie, ale nie jest to takie proste, wymaga trochę funkcji sieciowych proxy i nieco trudnego użycia tych ioctl()
wywołań. Ale istnieją narzędzia, które mogą to zrobić.
Obecnie nie pamiętam, który pakiet debian ma narzędzie do tego celu, ale przy odrobinie googlingu można to łatwo znaleźć.
Rozszerzenie: jak wspomniano tutaj @Jajesh (daj mu +1, jeśli mi dałeś), nazwa narzędzia watch
.
Rozszerzenie nr 2: wspomniane @kelnos, cat /dev/pts/14
wystarczyło również proste . Próbowałem tego i tak, zadziałało, ale nie poprawnie. Nie eksperymentowałem z tym dużo, ale wydaje mi się, że dane wyjściowe przesyłane do tego wirtualnego terminala trafiły albo do cat
polecenia, albo do jego pierwotnej lokalizacji, i nigdy do obu. Ale nie jest to pewne.