
내가 이렇게 하면:
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인 경우 대상 파이프에 연결되지 않은 것입니다.
정의되지 않은 경우 대상 파이프에 연결됩니다.
...적어도 지금까지의 테스트에 따르면