/dev/null
EOFをすぐに返すのではなく、永久にブロックを引き起こすバリエーションをread
探しています。そのようなデバイスがありますか?
目的の効果を得るために(経由で)名前付きパイプを作成することもできますが、スクリプトの最後mkfifo
でFIFOの切断を処理したくありません。
状況に応じてRPCサーバーがシャットダウンするのを待ちたいです。ポーリングを避けるために、netcatを介して接続を開きます。
netcat localhost 12345
サーバーがシャットダウンすると、接続は自動的に終了します。残念ながら、SSHを介してコマンドを実行するとstdinはに設定されるため、/dev/null
接続が閉じるのを待たずにEOFを送信した後、netcatはすぐに終了します。netcat -d
(stdinを待ってはいけません)バグはありますか? macOSとhotでは、このソリューションは実際に合理的な間隔でポーリングするよりも悪いことを意味します。
私はこの問題に対する解決策を持っています。標準入力をパイプに接続することです。しかし、私は純粋な好奇心のためにこの問題に特に興味があります。
答え1
残念ながら、SSH経由でコマンドを実行すると、接続が閉じるのを待たずに転送後すぐにシャットダウンするように
stdin
設定されています/dev/null
。netcat
EOF
バージョン4では、パイプを介して親プロセスに接続し、常に開いているが空のプロセスからデータを読み取るbash
共同プロセスを作成できます。この方法ではクリーンアップは必要ありません。read
stdout
例:
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
(またはdmsetup
1つを作成することもできます)。
# 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)も読み取ろうとすると、そのブロックに閉じ込められます。これにより、デバイスが検出されず(このタスクを実行するプロセスが中断されるため)、コンピュータが再起動されない可能性があります(終了プロセスを処理するプロセスが中断されるため)。