web-dev-qa-db-ja.com

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

私はそのPIDをecho- esする簡単なスクリプトを書きました:

#/bin/bash

while true; do
    echo $$;
    sleep 0.5;
done

私は1つのターミナルで上記のスクリプト(3844を繰り返し)を実行しており、別のターミナルでファイル記述子をtailしようとしています。

$ tail -f /proc/3844/fd/1

画面には何も表示されず、^cまでハングします。どうして?

また、すべてのSTDファイル記述子(IN/OUT/ERR)は同じptsにリンクしています。

$ ls -l /proc/3844/fd/
total 0
lrwx------ 1 mg mg 64 sie 29 13:42 0 -> /dev/pts/14
lrwx------ 1 mg mg 64 sie 29 13:42 1 -> /dev/pts/14
lrwx------ 1 mg mg 64 sie 29 13:42 2 -> /dev/pts/14
lr-x------ 1 mg mg 64 sie 29 13:42 254 -> /home/user/test.sh
lrwx------ 1 mg mg 64 sie 29 13:42 255 -> /dev/pts/14

これは正常ですか?

Ubuntu GNOME 14.04を実行しています。

この質問がSOまたはULではなくSUに属していると思われる場合は、教えてください。

10
cprn

/dev/ptsのファイルは通常のファイルではなく、仮想端末のハンドルです。読み取りと書き込みのpts動作は対称的ではありません(つまり、そこに書き込まれたものは後で通常のファイルやfifo/pipeのようにそこから読み取ることができます)が、仮想を作成したプロセスによって仲介されます端末:いくつかの一般的なものは、xterm、ssh、agetty、またはscreenです。制御プロセスは通常、ptsファイルを読み取り、ptsに書き込む内容を画面に表示するプロセスにキープレスをディスパッチします。

したがって、tail -f /dev/pts/14は、スクリプトを開始したターミナルでタップしたキーを出力し、echo meh > /dev/pts/14を実行すると、mehメッセージがターミナルに表示されます。

4
pqnet

少し前に、私はkindaの回避策を見つけましたときどきは、プロセスのpidがあり、あなたが目に優しくない結果が表示される可能性があります。

Sudo strace -p $pid 2>&1 | grep write\(
0
cprn

これについては、テーリングではなく、出力を監視する必要があると思います。

$ watch -n2 ls -l /proc/3844/fd/

これがあなたが必要とするものであることを願っています。

0
Jayesh