GNU/Linux >> Linux の 問題 >  >> Linux

「tail -f /proc/$pid/fd/1」ができないのはなぜですか?

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 メッセージがターミナルに表示されます。


Linux
  1. Linuxは複数の連続したパスセパレーター(/ home //// username /// file)をどのように処理しますか?

  2. Bash =〜正規表現とHttps://regex101.com/?

  3. Linux – / proc / pid / fd / xリンク番号?

  1. http://127.0.0.1:8000 でリッスンしている symfony プロセスを停止するにはどうすればよいですか?

  2. プロセスが実行されているフォルダーを見つける方法は?

  3. ターミナルでスクロールできないのはなぜですか?

  1. /proc/meminfo の MemTotal が変更されるのはなぜですか?

  2. /dev/tcp を使用するために < または > が必要な理由

  3. 推奨される使用方法に従って、Web サイトは /var/ または /usr/ に配置する必要がありますか?