如何在Julia中获取正在运行的外部命令的系统进程ID

时间:2016-07-28 19:14:55

标签: operating-system julia

问题: 我想知道从julia工作进程中作为命令调用的有缺陷的外部程序的系统进程ID。其中一些外部工具调用将导致该外部程序的内存泄漏。

我想监视这些系统调用的内存消耗,这样我就可以杀死它们,如果它们通过内存阈值而不是等待所有系统内存被消耗,并且某种任意的内存分配错误来击中运行的东西系统。

我正在寻找类似非阻塞的东西:

pid = @async run( `my_external_program` )

其中pid是my_external_program的系统进程ID

2 个答案:

答案 0 :(得分:1)

现在,您可以异步生成一个进程并使用spawn获取一个句柄,例如

process = spawn(`sleep 10`)

这会返回一个Process对象。不幸的是,我现在没有看到从这里获得pid的简单方法,但它应该是可能的。 process.handle字段是指向基础libuv process struct的指针。您可以通过将结构转换为Julia对象来解决这个问题,或者您可以在Julia的源代码中编写一个小C函数来获取它,例如。

int jl_get_proc_pid (uv_process *proc) { return proc.pid }
# In Julia
pid(process::Process) = ccall(:jl_get_proc_pid, (Ptr{Void},), Int, process.handle)

这可能是一个很好的机会来制作朱莉娅的补丁,虽然如果有人告诉我我错了并且有一种我更容易被忽视的方式会很好:)

答案 1 :(得分:0)

作弊。

#### In (executable) file "sleep_inner_wrapper"

#!/bin/bash
sleep 20                       # the actual command you want to run
echo -e "Finished sleeping\n"  # the event you want to detect on exit

### In (executable) file "sleep_outer_wrapper"

#!/bin/bash
./sleep_inner_wrapper &
jobs -p > mypid                # bingo


如果你没有杀死这个过程,你的julia会议:

julia> @async( run( `./sleep_outer_wrapper`))
Task (waiting) @0x00007f97a6303850

julia> pid = parse(Int64, chomp(readline(open("mypid","r"))))
10944

                          ... twenty seconds later ...

julia> Finished sleeping


如果你决定杀死这个过程,你的julia会议:

julia> @async( run( `./sleep_outer_wrapper`))
Task (waiting) @0x00007f97a63036c0

julia> pid = parse(Int64, chomp(readline(open("mypid","r"))))
10930

julia> run(Cmd(ByteString["kill";"-9";"$pid"]))