在Ruby中通过pid获取进程状态

6
有没有一种方法可以在Ruby中根据进程ID获取其子进程的状态?
例如,在Python中可以执行psutil.Process(pid).status

2
我相信进程模块里有你需要的东西:http://www.ruby-doc.org/core-1.9.3/Process.html - vlasits
你需要在哪些操作系统上运行这个程序? - Phrogz
3
Process模块没有任何获取正在运行的进程状态的方法,只能获取已退出的进程状态。 - dbenhur
3个回答

3

我不知道是否有一种可移植的 Ruby 方法来获取正在运行进程的状态。你可以使用 Process.wait 并检查 $?.exitstatus,但这似乎不是你想要的。对于 POSIX 解决方案,你可以使用

`ps -o state -p #{pid}`.chomp

获取PS生成的进程状态的字母代码

PROCESS STATE CODES
Here are the different values that the s, stat and state output specifiers
(header "STAT" or "S") will display to describe the state of a process.
D    Uninterruptible sleep (usually IO)
R    Running or runnable (on run queue)
S    Interruptible sleep (waiting for an event to complete)
T    Stopped, either by a job control signal or because it is being traced.
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    Defunct ("zombie") process, terminated but not reaped by its parent.

也许我漏掉了什么,但 -o=state= 不应该改成 -o state 吗?在我的 Linux 系统上用等号做法不起作用。 - user1142217
@BenCrowell 我不知道为什么我在10年前写了那个。等号可以用来重命名列标题,但这在这里无关紧要。已编辑原始内容以更正。谢谢。 - dbenhur

2

我也在寻找同样的东西,可惜ProcessStatus似乎无法从一个实时pid进行初始化。如果你想要执行类似于安全定时杀掉子进程之类的操作,这是非常重要的。

无论如何,如果你使用的是Linux系统,可以在/proc/$pid/status文件中的第二行找到它: status_line = File.open("/proc/#{pid}/status") {|f| f.gets; f.gets }

很可能比涉及外部程序的任何方法都要快得多。


简单而优雅的解决方案,避免依赖外部程序(和 shell 命令),谢谢。 - Navarro

0
在OS X上,我设置了一个字符串:
outputstring="ps -O=S -p #{mypid}"

然后在%x调用中执行它:

termoutput=%x[#{outputstring}]

如果需要,我可以显示它,或者只保持输出干净,并根据调用发现的状态进行操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接