raspberry-pi OS イメージを microSD カードにコピーする進行状況を監視しようとしています。これは、Kill a process called using open3 in ruby に似ていますが、プロセスを強制終了しているのではなく、進行状況メッセージを発行するコマンドをプロセスに送信しています。
rpath = device_path.gsub(/disk/, "rdisk")
puts "\n\nCopying image to #{rpath}"
if false
stdout_err, status = Open3.capture2e( "sudo", "dd", "bs=1m", "if=#{source_path}", "of=#{rpath}" )
puts stdout_err
else
cmd = "sudo dd bs=1m if=#{source_path} of=#{rpath}"
Open3.popen2e(cmd) do |stdin, stdout_err, wait_thr|
Thread.new do
stdout_err.each {|l| puts l}
end
Thread.new do
while true
sleep 5
if true
Process.kill("INFO", wait_thr.pid) #Tried INFO, SIGINFO, USR1, SIGUSR1
# all give: `kill': Operation not permitted (Errno::EPERM)
else
stdin.puts 20.chr #Should send ^T -- has no effect, nothing to terminal during flash
end
end
end
wait_thr.value
end
最初のセクション ('if false' の後) は、Open3.capture2eを使用して画像をフラッシュします。これは機能しますが、もちろん進捗情報は発行されません。
「else」の後のセクションは、Open3.popen2eを使用して画像をフラッシュします。また、'Process.kill("INFO", wait_thr.pid)' を発行するか、5 秒ごとに ^T (20.chr) を stdin ストリームに送信して、進行状況を表示しようとします。
Process.kill行は、「操作は許可されていません」というエラーを生成します。stdin.puts行はまったく効果がありません。
もう 1 つ... popen2e プロセスが点滅している間に、キーボードで ctrl-T を押すと、進行状況の応答が生成されます。プログラムでそれを行うことはできません。
どんな助けでも大歓迎です!