파이프를 사용하여 백그라운드에서 명령 실행

파이프를 사용하여 백그라운드에서 명령 실행

내가 읽고있다rpi에 관한 이 질문에 관해서그리고 다음과 같은 생각을 하게 만드는 흥미로운 문구를 발견했습니다.

mkfifo tcp.stream
nc -l -p 1234 > tcp.stream | omxplayer --live tcp.stream

io 리디렉션에 유의하세요. STDOUT이 두 번 리디렉션되었습니다! 내 관심사는 사용 가능한 STDIN과 연결되지 않은 omxplayer가 제어하기가 약간 어려울 수 있다는 것입니다. 그러나 이것이 omxplayer가 종료될 때 SIGPIPE를 사용하여 nc를 종료하는 이점이 있다고 생각합니다. 이것이 좋은 생각입니까? 이상한 상황에서 권장됩니까?

답변1

nc파이프의 한쪽 끝이 즉시 닫힙니다. omxplayer칩은 ncfifo(파이프 아님)에 쓸 때 SIGPIPE를 받습니다.

표준 입력을 통해 제어를 유지할 nc수 있도록 백그라운드에서 실행하는 것이 가장 좋습니다 .omxplayer

mkfifo tcp.stream
nc -l -p 1234 > tcp.stream &
omxplayer --live tcp.stream

그러나 쉘의 작업 제어 관점에서 대신 사용하는 것이 실제로 의미가 있습니다 |.&

사용 |:

$ mkfifo fifo
$ nc -l -p 1234 >fifo | cat fifo

nccat동일한 프로세스 그룹(PGID 9177)에 속합니다 .

$ ps f -o pid,ppid,pgid,command
  PID  PPID  PGID COMMAND
 9095  1681  9095 bash
 9179  9095  9179  \_ ps f -o pid,ppid,pgid,command
 1691  1681  1691 bash
 9177  1691  9177  \_ nc -l -p 1234
 9178  1691  9177  \_ cat fifo

Ctrl사용자가 +를 입력하면 모두 SIGINT를 받고 종료됩니다 C.

사용 &:

$ mkfifo fifo
$ nc -l -p 1234 >fifo & cat fifo
[1] 9183

nccat서로 다른 프로세스 그룹(PGID 9183 및 9184)에 속합니다 .

$ ps f -o pid,ppid,pgid,command
  PID  PPID  PGID COMMAND
 9095  1681  9095 bash
 9185  9095  9185  \_ ps f -o pid,ppid,pgid,command
 1691  1681  1691 bash
 9183  1691  9183  \_ nc -l -p 1234
 9184  1691  9184  \_ cat fifo

cat이 경우 Ctrl사용자가 + 를 입력하면 포그라운드 프로세스( )만 SIGINT를 수신합니다 C. 아직 연결되지 않은 경우 nc백그라운드에서 계속 실행됩니다.

^C
$ jobs
[1]+  Running                 nc -l -p 1234 > fifo &
$ kill %
[1]+  Terminated              nc -l -p 1234 > fifo

관련 정보