【问题标题】:How to execute shell commands from Ruby in their own shell?如何在自己的 shell 中从 Ruby 执行 shell 命令?
【发布时间】:2014-12-29 21:07:29
【问题描述】:

我正在编写一个执行一些 adb shell 命令的小型 Rub​​y 脚本。当我尝试在 android 设备上运行屏幕记录然后发送一些滑动和触摸事件时,就会出现问题。

如果我运行 adb shell screenrecord 而没有 "&" 最后触摸和滑动,事件仅在 screenrecord 超时时发生:

adb shell screenrecord --time-limit 10 /sdcard/dumper.mp4

如果我在最后使用"&" 运行它,尽管将高--time-limit 选项传递给screenrecord,但在执行触摸或滑动事件时screenrecord 会立即切断。

adb shell screenrecord --time-limit 10 /sdcard/dumper.mp4&

有没有一种方法可以创建一个子进程,让它运行screenrecord,然后在screenrecord 完成并并行执行触摸和滑动时死掉?

我尝试使用fork,但父母最终死了,如果我重新执行程序,就会执行触摸和滑动。

这是我之前 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 文件以触发记录过程。我确信 exec 没有失败,因为我尝试模拟 IRB 中的步骤。

跑步

irb>>exec(<adb screenrecord command>)

在按预期完成后杀死 Ruby shell。

irb>>system(<adb screenrecord command>&)
irb>>system(<adb tap or swipe command>)

像梦一样工作!它完全符合我的要求。从设备中提取录制的视频正是我想要的。


我想我已经弄清楚发生了什么。使用&amp; 运行 adb 会将 adb 进程发送到后台并停止录制。运行 adb tap 将其带回前台。因此,我的视频被截断了。

我想我必须在它自己的 shell 中触发 adb screenrecord。

与人类的 bash 类比是打开一个终端,开始录制屏幕。打开另一个终端,开始发送点击和滑动。

【问题讨论】:

  • 你用来分叉的代码是什么?您在等待子 pid 完成吗?
  • 我已经添加了我以前 fork 的代码。我特别不想听孩子出口,也不想等待/等待他们。
  • 对于 fork,您实际上没有太多选择,您需要等待所有子 pid,否则父进程将关闭并可能离开僵尸进程。就像在代码末尾添加Process.wait 一样简单
  • 程序的结构使得父母总是最后完成。 :(
  • 很难从一个小代码sn-p 看出发生了什么。你确定 exec 没有失败吗?

标签: android ruby shell adb


【解决方案1】:

事实证明,这是一个 Android shell 屏幕记录问题,而不是 Ruby 问题。

Android 正在对录制的视频长度进行优化,这会扭曲我的输出视频。它只记录从第一次 UI 更改到最后一次 UI 更改的视频。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多