私がこうすれば:
x | y
xが実行中にyに接続されていることを確認する方法はありますか?私はyが何であるかわからず、yを始める責任はありません。
特にNode.jsランタイムについて話しているので、これはNode.js関連の問題かもしれません。しかし、最終的に与えられた実行時間を決定できるかどうかを知りたいです。可能ですか?達成する方法?
stdout / stderrが他のプロセスのstdinに接続されていることを確認することは可能ですか?それがこの質問の目的だと思います。
答え1
プログラムの出力がパイプに入るかどうかを確認します。https://nodejs.org/api/fs.html#fs_class_fs_stats、返されたオブジェクトを呼び出してfs.fstat(FileDescriptor)
から呼び出しようとしています(FIFO ==先入れ先出し==パイプまたは名前付きパイプ)。isFIFO()
stat
$ </dev/null node -e 'var fs=require("fs");
fs.fstat(0,function(err,stats){ if(err) throw(err); console.log(stats.isFIFO()); }); '
false
$ : | node -e 'var fs=require("fs");
fs.fstat(0,function(err,stats){ if(err) throw(err); console.log(stats.isFIFO()); }); '
true
Cはシステムコールを実行し、fstat
マクロを使用して返された.st_mode
フィールドをテストします。struct stat
S_ISFIFO
CPUサイクルを無駄にしたい場合や外部バイナリを使用したい場合は、答えを取得することができます(または組み込み関数になるtest -p /dev/fd/$THE_FD
シェルで答えを呼び出すか、実行するか、結果を決定する他のものを起動できます)。ファイル形式)。test
stat
答え2
プログラムがそのプロセスで与えられたオープンファイル記述子がパイプかFIFOを参照するかを決定することは可能で非常に簡単です。これはライブラリ関数を使用した簡単な練習ですfstat()
。
fstat()
選択したプログラミング言語を呼び出す方法を理解する必要があります。 CまたはC ++でこれを行う関数は非常に簡単です。
#include <sys/types.h> // IEEE 1003.1:2008 はもう必要ありません。 #include <sys/stat.h> #include <unistd.h> /// \brief は、ファイル記述子が開いていてパイプ/FIFO を表すことを確認します。 外部インライン bool /// \説明がパイプ/FIFOに対して開いている場合にのみtrueを返します。 is_fifo( int fd ///< テストするファイル記述子 ){ 構造統計; 0 <= fstat(fd, &s) && S_ISFIFO(s.st_mode) を返します。 }
systemdのlibsystemdライブラリには、少し複雑なsd_is_fifo()
ライブラリ機能があります。
答え3
ファイル記述子がパイプかどうかをテストするのは簡単で移植可能です。。パイプの反対側の端に何があるのかを理解するのではありません。
外部からlsof
onの最新バージョンは次のとおりLinux
です。
$ sleep 100 | sleep 200 &
[1] 15314 15315
$ lsof -ad0-1 -E -p 15314
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sleep 15314 stephane 0u CHR 136,1 0t0 4 /dev/pts/1
sleep 15314 stephane 1w FIFO 0,10 0t0 17895049 pipe 15315,sleep,0r
これは、stdout 15314がパイプの書き込み端であり、もう一方の端のstdinが15315であることを示しています。
答え4
Node.jsを使用すると、* nixシステムで実行されていると機能するようです。
const isTTY = process.stdout.isTTY;
trueの場合、ターゲットパイプに接続されていません。
定義されていない場合は、ターゲットパイプに接続されます。
...少なくともこれまでのテストによると