読書を永遠にブロックする特別なデバイスはありますか?

読書を永遠にブロックする特別なデバイスはありますか?

/dev/nullEOFをすぐに返すのではなく、永久にブロックを引き起こすバリエーションをread探しています。そのようなデバイスがありますか?

目的の効果を得るために(経由で)名前付きパイプを作成することもできますが、スクリプトの最後mkfifoでFIFOの切断を処理したくありません。

状況に応じてRPCサーバーがシャットダウンするのを待ちたいです。ポーリングを避けるために、netcatを介して接続を開きます。

netcat localhost 12345

サーバーがシャットダウンすると、接続は自動的に終了します。残念ながら、SSHを介してコマンドを実行するとstdinはに設定されるため、/dev/null接続が閉じるのを待たずにEOFを送信した後、netcatはすぐに終了します。netcat -d(stdinを待ってはいけません)バグはありますか? macOSとhotでは、このソリューションは実際に合理的な間隔でポーリングするよりも悪いことを意味します。

私はこの問題に対する解決策を持っています。標準入力をパイプに接続することです。しかし、私は純粋な好奇心のためにこの問題に特に興味があります。

答え1

残念ながら、SSH経由でコマンドを実行すると、接続が閉じるのを待たずに転送後すぐにシャットダウンするようにstdin設定されています/dev/nullnetcatEOF

バージョン4では、パイプを介して親プロセスに接続し、常に開いているが空のプロセスからデータを読み取るbash共同プロセスを作成できます。この方法ではクリーンアップは必要ありません。readstdout

例:

coproc read # Never writes anything into its stdout.
netcat localhost 12345 <&${COPROC[0]} # Read from co-process' stdout.

もう一つの方法はlongstdinからstdoutパイプすることですsleep

sleep 365d | netcat localhost 12345

答え2

使用できますcryptsetup(またはdmsetup1つを作成することもできます)。

# truncate -s 8M luksblock.img
# cryptsetup luksFormat luksblock.img
# cryptsetup luksOpen luksblock.img luksblock
# cryptsetup luksSuspend luksblock
# cat /dev/mapper/luksblock
( ... no output because it's blocked / suspended ... )

それはどのように見えるかdmsetup

# dmsetup info luksblock
Name:              luksblock
State:             SUSPENDED
Read Ahead:        256
Tables present:    LIVE
Open count:        0
Event number:      0
Major, minor:      253, 71
Number of targets: 1
UUID: CRYPT-LUKS1-87bc6d9fd7fa419bbf15425c062d0916-luksblock

一時停止デバイスを使用できますdmsetup

dmsetup suspend luksblock

したがって、ファイルサポートを必要としない保留中のデバイスマッピングを作成することは可能ですluksblock.imgが、最後の部分はあなたに任せます。 :-血


もちろん、このアプローチには大きな欠点があります。デバイスは他のすべてのブロックデバイス間に表示され、デバイスを/proc/partitions監視または検出するすべてのエントリ(たとえば、新しい物理ボリュームを探すLVM)も読み取ろうとすると、そのブロックに閉じ込められます。これにより、デバイスが検出されず(このタスクを実行するプロセスが中断されるため)、コンピュータが再起動されない可能性があります(終了プロセスを処理するプロセスが中断されるため)。

関連情報