프로세스가 파이프를 통해 다른 프로세스에 "연결"되어 있는지 확인

프로세스가 파이프를 통해 다른 프로세스에 "연결"되어 있는지 확인

내가 이렇게 하면:

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인 경우 대상 파이프에 연결되지 않은 것입니다.

정의되지 않은 경우 대상 파이프에 연결됩니다.

...적어도 지금까지의 테스트에 따르면

관련 정보