我正在寫一個執行adb shell命令的小Ruby腳本。當我嘗試在android設備上運行屏幕記錄,然後發送一些滑動和觸摸事件時,會發生問題。如何在他們自己的shell中執行Ruby的shell命令?
如果我跑亞行外殼screenrecord
沒有"&"
末觸摸和滑動,事件只發生在screenrecord
超時:
adb shell screenrecord --time-limit 10 /sdcard/dumper.mp4
如果我有"&"
末運行,在screenrecord
儘管在screenrecord
處選擇了較高的--time-limit
選項,但仍會在觸摸或滑動事件發生時立即切斷。
adb shell screenrecord --time-limit 10 /sdcard/dumper.mp4&
有沒有一種方法,我可以只創建一個子進程有它運行screenrecord
當screenrecord
結束剛剛去世,並行執行的觸摸和刷卡?
我試過使用fork
但父母最終死亡,如果我重新執行程序觸摸和刷卡進行。
這是我用叉子叉代碼:
def adb(arg)
fork do
exec("adb -s #{ARGV[0]} #{arg}")
exit
end
end
我試圖尋找在spawn
作爲替代,但它只是不會工作:
if line.include? "<record>"
puts "comes here"
duration=line.scan(/\d+/).first.to_i
adb_sep("shell screenrecord --time-limit #{duration} /sdcard/demo.mp4")
它基本上解析XML文件,標籤來觸發記錄過程。我相信執行官沒有失敗,因爲我試圖模擬IRB中的步驟。
運行
irb>>exec(<adb screenrecord command>)
殺死紅寶石殼然而如預期完成之後。
irb>>system(<adb screenrecord command>&)
irb>>system(<adb tap or swipe command>)
像夢一樣工作!它正是我想要它做的。從設備拉出錄製的視頻顯示了我想要的。
我想我已經知道發生了什麼事情。用&
運行adb將adb進程發送到後臺並停止錄製。運行adb tap將它帶回前臺。因此我正在拍攝視頻。我想我將不得不在自己的shell中觸發adb screenrecord。
與人類的bash比喻將打開一個終端,開始記錄screeen。打開另一個終端,開始發送點擊和輕掃。
你用來分叉的代碼是什麼?你是否在等待孩子pid完成? – Benji 2014-11-03 09:31:17
我已經添加了我用來分叉的代碼。我特別不想聽孩子出門,也不想等他們出來。 – 2014-11-03 09:36:14
你沒有太多的選擇,你需要等待所有的孩子pids,否則父進程將關閉,並可能離開殭屍進程。 就像在代碼末尾添加Process.wait一樣簡單 – Benji 2014-11-03 09:43:01