プロセスがパイプを介して他のプロセスに「接続」されていることを確認する

プロセスがパイプを介して他のプロセスに「接続」されていることを確認する

私がこうすれば:

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 statS_ISFIFO

CPUサイクルを無駄にしたい場合や外部バイナリを使用したい場合は、答えを取得することができます(または組み込み関数になるtest -p /dev/fd/$THE_FDシェルで答えを呼び出すか、実行するか、結果を決定する他のものを起動できます)。ファイル形式)。teststat

答え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

ファイル記述子がパイプかどうかをテストするのは簡単で移植可能です。。パイプの反対側の端に何があるのか​​を理解するのではありません。

外部からlsofonの最新バージョンは次のとおり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の場合、ターゲットパイプに接続されていません。

定義されていない場合は、ターゲットパイプに接続されます。

...少なくともこれまでのテストによると

関連情報