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 によってアクセスできるディスクまたはメモリ領域がないため、変更を inotify に署名できるものは何もありません。
このキャラクター デバイスは仮想端末であり、実際にはネットワーク ソケットのように機能します。この仮想端末で実行されているプログラムは、このデバイスに接続し (tcp ポートに telnet で接続したかのように)、書き込みたいものを書き込みます。より複雑なものもあります。たとえば、画面のロック、端末制御シーケンスなどです。これらは通常 ioctl()
によって処理されます。
どういうわけか仮想端末を見たいと思います。 Linuxでも実行できますが、それほど単純ではありません。ネットワークプロキシのような機能が必要であり、これらのioctl()
の少しトリッキーな使用法が必要です。 呼び出します。しかし、それを可能にするツールがあります。
現在、どの debian パッケージにこの目的のためのツールが含まれているか思い出せませんが、少しグーグル検索すれば、おそらく簡単に見つけることができます。
拡張子: @Jajesh がここで述べたように (あなたが私に与えた場合は彼に +1 を与えてください)、ツールの名前は watch
です .
拡張機能 #2: @kelnos が言及、単純な cat /dev/pts/14
も十分でした。私はそれを試しましたが、はい、うまくいきましたが、正しくはありませんでした。私はそれについてあまり実験していませんが、その仮想端末への出力がどちらかになったように思えます cat
に コマンド、または元の場所に移動し、両方に移動することはありません。しかし、確かではありません。
/dev/pts
のファイル 通常のファイルではなく、仮想端末のハンドルです。A pts
読み取りと書き込みの動作は対称的ではありません (つまり、通常のファイルや fifo/パイプのように、そこに書き込まれたものを後で読み取ることができます)、仮想端末を作成したプロセスによって仲介されます:いくつかの一般的なものは xterm ですまたはsshまたはagettyまたはscreen。制御プロセスは通常、pts
を読み取るプロセスにキー押下をディスパッチします。 pts
に書き込んだ内容を画面に表示します。 .
したがって、tail -f /dev/pts/14
スクリプトを開始した端末でタップしたキーを出力します。 echo meh > /dev/pts/14
を実行すると meh
メッセージがターミナルに表示されます。