【发布时间】:2013-01-16 06:56:00
【问题描述】:
我正在尝试使用 Ruby 编写脚本以在 Android 应用程序上运行猴子测试。我被 1.8 Ruby 卡住了,无法使用 spawn。
详情请参阅下面的代码。由于某些原因,即使在monkey 进程完成后,logcat 进程仍将继续运行。在杀死logcat 进程之前,我曾使用Process.wait() 等待monkey 进程完成,但它并没有杀死它。我没有正确使用fork 吗?
谢谢。
pid_logcat = fork do
puts "Enter capturing logcat"
system("adb shell logcat | tee logcat.log")
end
pid_monkey = fork do
puts "Running monkey script"
system("adb shell monkey -p TestApp --throttle 200 -v 1000000 | tee Monkeylog.txt")
end
Process.wait(pid_monkey)
Process.kill("KILL", pid_logcat)
已编辑 1
我可以确认adb 确实产生了另一个不在 ruby 控制范围内的进程,我现在该怎么办? Process.kill('HUP', -Process.getpgid(pid_logcat)) 不起作用,因为这也会杀死父进程(红宝石进程分叉这个)
已编辑 2
exec() 似乎也不适用于 pid_logcat 分叉进程。
【问题讨论】:
-
尝试使用 exec 而不是 system 来启动这些进程。您正在向 ruby 进程发送终止,而不是直接向 adb 发送。我不熟悉 adb 的运行方式,但如果它自己进行分叉或玩会话,它会避开那个终止信号。
-
感谢 Catnapper,但至少逻辑似乎是正确的吧?使用它似乎是正确的吧?
-
您的方法是正确的,但听起来您需要找到adb的子进程的pid。 adb 是否有编写 pidfile 的选项?
-
adb 实例的这个子进程 - 是它的父 pid 1,还是父 adb 进程的 pid?如果它是父 pid,您可以确定每个 adb 父级属于哪个 adb 子级,并向它们发送 kills。如果父 pid 为 1,这意味着它是守护进程,并且没有简单的方法来确定哪个 adb 是父进程。如果是这种情况,您可能会考虑杀死所有 adb 进程的霰弹枪方法。
标签: android ruby process stress-testing monkey