私はその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に属していると思われる場合は、教えてください。
/dev/pts
のファイルは通常のファイルではなく、仮想端末のハンドルです。読み取りと書き込みのpts
動作は対称的ではありません(つまり、そこに書き込まれたものは後で通常のファイルやfifo/pipeのようにそこから読み取ることができます)が、仮想を作成したプロセスによって仲介されます端末:いくつかの一般的なものは、xterm、ssh、agetty、またはscreenです。制御プロセスは通常、pts
ファイルを読み取り、pts
に書き込む内容を画面に表示するプロセスにキープレスをディスパッチします。
したがって、tail -f /dev/pts/14
は、スクリプトを開始したターミナルでタップしたキーを出力し、echo meh > /dev/pts/14
を実行すると、meh
メッセージがターミナルに表示されます。
少し前に、私はkindaの回避策を見つけましたときどきは、プロセスのpid
があり、あなたが目に優しくない結果が表示される可能性があります。
Sudo strace -p $pid 2>&1 | grep write\(
これについては、テーリングではなく、出力を監視する必要があると思います。
$ watch -n2 ls -l /proc/3844/fd/
これがあなたが必要とするものであることを願っています。