问:什么会使进程进入?Es
状态(ps / Mac OS X)?
根据macos ps源代码,这是Unknown,Exiting和Session领导者的组合
我们正在使用adb并行处理多个Android平板电脑。我正在排查涉及流程无法正常退出的错误。
完整的调用堆栈为:
外壳(Mac OSX)
红宝石(Thread
+ PTY.spawn
)
adb
我们首先遇到一个问题,即adb进程陷入僵尸状态,可能是因为正在读取进程输出的红宝石部分阻止了I / O。我们通过使用一个单独的线程来监视任何未完成的子进程并不时对它们执行Process.waitpid(pid, Process::WNOHANG)
来解决该问题。这样可以使该过程正常结束。
但是我们现在有些进程陷入了?Es
这种新状态(对我来说)。
(在压力测试中,这种情况发生的几千个电话中就有一个)
$ pstree `pgrep -f ruby` -+- 46990 lacostej ruby lenovo_2018.rb no test_env \--= 51214 lacostej (adb) $ ps -ael | grep 51214 501 51214 46990 6006 0 0 0 0 0 - ?Es 0 ?? 0:00.00 (adb)
Mac OS X ps代码:
https://opensource.apple.com/source/adv_cmds/adv_cmds-172/ps/tasks.c.auto.html,请参见
char mach_state_table[] = " RUSITH?";
https://opensource.apple.com/source/adv_cmds/adv_cmds-172/ps/print.c.auto.html,请参见
extern int mach_state_order();
问:有人知道导致进程处于这种状态的原因吗?
此内容已在Mac OS X 10.11.6和高达2.5.1的各种稳定红宝石上复制。现在,我们将Mac OSX升级到10.13。
该程序在多种平板电脑上均可正常运行,但开始出现在运行Android 7的Lenovo Tab Essential 7上。
Adb来自Android平台工具28,是我撰写本文时最新的版本。