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

Operating system 如何在Julia中获取正在运行的外部命令的系统进程id,operating-system,julia,Operating System,Julia,问题: 我想知道一个有缺陷的外部程序的系统进程ID,该程序作为命令从julia worker进程中调用。其中一些外部工具调用将导致该外部程序的内存泄漏 我想监控这些系统调用的内存消耗,这样,如果它们超过内存阈值,我就可以杀死它们,而不是等待所有系统内存被消耗,以及某种任意内存分配错误影响系统上运行的东西 我正在寻找类似非阻塞的东西: pid = @async run( `my_external_program` ) 其中,pid将是my_external_程序的系统进程id #### In (

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

我想监控这些系统调用的内存消耗,这样,如果它们超过内存阈值,我就可以杀死它们,而不是等待所有系统内存被消耗,以及某种任意内存分配错误影响系统上运行的东西

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

pid = @async run( `my_external_program` )
其中,pid将是my_external_程序的系统进程id

#### 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

如果不终止进程,则执行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> @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"]))

如果决定终止进程,请执行以下操作:

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> @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"]))

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

process = spawn(`sleep 10`)
这将返回一个
进程
对象。不幸的是,我现在看不到一个简单的方法来获取pid,但这应该是可能的。
process.handle
字段是指向底层的指针。您可以通过将结构转换为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)

这可能是一个为Julia制作补丁的好机会,尽管如果有人告诉我我错了会很好,还有一个我忽略了的更简单的方法:)

看起来这很适合未来(不幸的是,尚未编写)有关shell脚本和管道的文档()顺便说一句,我从来没有说过它不丑。我正在寻找一种方法,从Julia自身内部以一种操作系统不可知论的方式来做到这一点。这在大多数其他语言中都很容易做到,但在Julia中很难找到。在我目前的情况下,为了克服这个问题,我也通过调用一个perl包装器脚本“”进行了欺骗,该脚本为您管理子代PID,并允许您在生成命令时施加内存或时间限制。嗯,如果您真的想要一种操作系统不可知的方式,目前我看到这种情况发生的唯一方式是通过
ccall
,特别是,我会打开一个问题,请求此功能: