다음과 같이 node.js 프로세스를 시작한다고 가정해 보겠습니다.
node script.js &
프로세스가 시작된 후 프로세스에 데이터를 파이프하는 방법이 있습니까?
일반적으로 우리는 다음을 수행합니다.
cat <file> | node script.js
하지만 내가 보는 문제는 때때로 Node.js 프로세스가 실제로 일찍 시작되지 않는다는 것입니다.
내 목표는 파일에 데이터가 없더라도 node.js 프로세스가 시작되도록 하는 것입니다.
그래서 node.js 프로세스를 백그라운드 프로세스로 시작한 다음 파이프에 연결하려고 하는데 이것이 가능한지 확실하지 않습니다.
답변1
를 사용하여 생성된 명명된 파이프(fifos)의 변형을 찾고 있는 것 같습니다 mkfifo
.
그런 다음 다음과 같이 할 수 있습니다.
mkfifo my-pipe
node script.js < my-pipe &
쓰기를 위해 my-pipe를 열 때까지 차단됩니다. 따라서 script.js가 파일을 열 수 있도록 하려면(물론 아직 파일에서 아무것도 읽을 수는 없음) 쓰기 위해 파일을 열어야 합니다. 이를 수행하는 간단한 방법은 해당 파일로 절전 모드를 리디렉션하는 것입니다. ( sleep 3650d > my-pipe &
). 이는 또한 절전 모드를 종료할 때까지 script.js가 EOF(파일 끝)를 가져오는 것을 방지합니다(쓰기 위해 열려 있는 fifo가 없고 모든 데이터가 사라진 경우 읽기 측에서 EOF를 얻습니다).
이제 my-pipe에 작성하여 언제든지 더 많은 행을 제공할 수 있습니다. 탐색(또는 mmap 등) 없이 쓰기하면 작동합니다. 으로 테스트할 수 있습니다 echo 'DATA' > my-pipe
.
따라서 모든 것을 종합하면 다음과 같습니다.
mkfifo my-pipe
node script.js < my-pipe &
sleep 3650d > my-pipe &
sleep_pid=$!
get-data-command > my-pipe # placeholder for real command to get data
get-data-command > my-pipe
# and so on, for more data.
kill $sleep_pid # kill the sleep, giving script.js an EOF.
Wildcard가 지적했듯이 실제로 script.js가 청취 소켓을 열고 그런 식으로 데이터를 받아들이기를 원할 수도 있습니다. TCP 소켓에서처럼 인증을 처리하지 않으려면 Unix 도메인 소켓을 사용할 수 있습니다(Unix 소켓은 파일 권한을 사용하기 때문).