【发布时间】:2021-10-17 13:10:20
【问题描述】:
我想在 Julia 中运行一个外部进程给定的时间(比如 10 秒)并捕获它的输出。
我尝试了类似readchomp(`timeout 5 sleep 10`) 的东西(用任意外部进程替换sleep 10)。但是,如果进程被timeout 杀死,则会引发 ProcessFailedException,并且在它被杀死之前我无法读取它生成的程序的输出。
【问题讨论】:
我想在 Julia 中运行一个外部进程给定的时间(比如 10 秒)并捕获它的输出。
我尝试了类似readchomp(`timeout 5 sleep 10`) 的东西(用任意外部进程替换sleep 10)。但是,如果进程被timeout 杀死,则会引发 ProcessFailedException,并且在它被杀死之前我无法读取它生成的程序的输出。
【问题讨论】:
run 仅在wait = true (默认情况下)时抛出异常。您需要将该 kwarg 设置为 false,然后在进程中手动 wait,同时将 stdout 重定向到例如一个IOBuffer 通过pipeline:
shell> cat loop.sh
#!/bin/bash
for i in {1..10}; do
echo $i
sleep 1
done
julia> b = IOBuffer()
IOBuffer(data=UInt8[...], readable=true, writable=true, seekable=true, append=false, size=0, maxsize=Inf, ptr=1, mark=-1)
julia> p = run(pipeline(`timeout 5 ./loop.sh`, stdout = b), wait = false); wait(p)
julia> p
Process(`timeout 5 ./loop.sh`, ProcessExited(124))
julia> String(take!(b))
"1\n2\n3\n4\n5\n"
【讨论】: