GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum kann ich nicht `tail -f /proc/$pid/fd/1` ausführen?

Machen Sie eine strace von tail -f , das erklärt alles. Der interessante Teil:

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)

Was es macht? Es richtet einen inotify ein Handler auf die Datei und wartet dann, bis etwas mit dieser Datei passiert. Wenn der Kernel tail sagt durch diesen Inotify-Handler, dass sich die Datei geändert hat (normalerweise wurde sie angehängt), dann tail 1) sucht 2) liest die Änderungen 3) schreibt sie auf den Bildschirm.

/proc/3844/fd/1 auf Ihrem System ist ein symbolischer Link zu /dev/pts/14 , bei dem es sich um ein Zeichengerät handelt. Es gibt nicht so etwas wie eine "Speicherkarte", auf die damit zugegriffen werden könnte. Somit gibt es nichts, dessen Änderungen bei inotify signiert werden könnten, da es keine Platte oder keinen Speicherbereich gibt, auf den damit zugegriffen werden könnte.

Dieses Zeichengerät ist ein virtuelles Terminal, das praktisch wie eine Netzwerksteckdose funktioniert. Programme, die auf diesem virtuellen Terminal ausgeführt werden, verbinden sich mit diesem Gerät (so als ob Sie per Telnet an einen TCP-Port angeschlossen wären) und schreiben, was sie schreiben möchten. Es gibt auch komplexere Dinge, zum Beispiel das Sperren des Bildschirms, Terminal-Steuersequenzen und dergleichen, diese werden normalerweise von ioctl() behandelt Anrufe.

Ich denke, Sie möchten sich irgendwie ein virtuelles Terminal ansehen. Es kann unter Linux durchgeführt werden, aber es ist nicht so einfach, es erfordert einige Netzwerk-Proxy-ähnliche Funktionen und ein wenig knifflige Verwendung dieser ioctl() Anrufe. Aber es gibt Tools, die das können.

Derzeit kann ich mich nicht erinnern, welches Debian-Paket das Tool für dieses Ziel enthält, aber mit ein wenig Googeln könnten Sie das wahrscheinlich leicht finden.

Erweiterung: Wie @Jajesh hier erwähnte (geben Sie ihm +1, wenn Sie mir gegeben haben), heißt das Tool watch .

Erweiterung #2: @kelnos erwähnt, ein einfacher cat /dev/pts/14 reichten auch. Ich habe das versucht, und ja, es hat funktioniert, aber nicht richtig. Ich habe nicht viel damit experimentiert, aber es scheint mir, als ob eine Ausgabe, die in dieses virtuelle Terminal geht, weder noch gegangen ist an die cat Befehl oder an seinen ursprünglichen Ort und niemals an beides. Aber es ist nicht sicher.


Dateien in /dev/pts sind keine regulären Dateien, sie sind Handles für virtuelle Terminals. A pts Das Verhalten beim Lesen und Schreiben ist nicht symmetrisch (das heißt, was dort geschrieben ist, kann später daraus gelesen werden, wie eine normale Datei oder eine Fifo/Pipe), sondern wird durch den Prozess vermittelt, der das virtuelle Terminal erstellt hat:einige übliche sind xterm oder ssh oder agetty oder screen. Der steuernde Prozess sendet normalerweise Tastendrücke an Prozesse, die den pts lesen Datei und rendern auf dem Bildschirm, was sie auf pts schreiben .

Also tail -f /dev/pts/14 druckt die Tasten, die Sie auf dem Terminal tippen, von dem aus Sie Ihr Skript gestartet haben, und wenn Sie echo meh > /dev/pts/14 tun die meh Meldung erscheint im Terminal.


Linux
  1. Warum ist das Drucken auf stdout so langsam? Kann es beschleunigt werden?

  2. /proc/[pid]/pagemaps und /proc/[pid]/maps | Linux

  3. Wie finde ich heraus, aus welchem ​​Ordner ein Prozess läuft?

  4. Warum gibt es unter Linux so viele /dev/tty?

  5. Warum kann ich im Terminal nicht scrollen?

Wie behandelt Linux mehrere aufeinanderfolgende Pfadtrennzeichen (/home////username///file)?

Linux – /proc/pid/fd/x Linknummer?

/proc/cpuinfo- und /proc/meminfo-Dateien unter Linux

Die Dateien /proc/mounts, /etc/mtab und /proc/partitions verstehen

Warum haben die Verzeichnisse /home, /usr, /var usw. alle dieselbe Inode-Nummer (2)?

Warum sind < oder > erforderlich, um /dev/tcp