パイプを使用してバックグラウンドでコマンドを実行する

パイプを使用してバックグラウンドでコマンドを実行する

私が読んでいるrpiに関するこの質問についてそして、次のような考えをさせる興味深いフレーズを発見しました。

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

ioリダイレクトに注意してください。 STDOUTが2回リダイレクトされました!私の興味は、利用可能な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

おすすめ記事