Julia 0.4.7:如何捕捉 SIGTERM
Julia 0.4.7: How to catch SIGTERM
我在 julia-0.4.7 脚本中的 SIGTERM(不是 SIGINT)事件后得到以下堆栈跟踪:
signal (15): Terminate
write at /lib64/libpthread.so.0 (unknown line)
unknown function (ip: 0x2ade16a02893)
uv_write2 at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
jl_uv_write at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
uv_write at ./stream.jl:951
buffer_or_write at ./stream.jl:972
write at ./stream.jl:1011
print at ./char.jl:47
unknown function (ip: 0x2ade1e06d0a2)
jl_apply_generic at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
print at strings/io.jl:18
jl_apply_generic at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
jl_f_apply at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
println at strings/io.jl:25
jl_apply_generic at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
anonymous at /path/to/home/test.jl:4
unknown function (ip: 0x2ade169c5b13)
unknown function (ip: 0x2ade169c672c)
jl_load at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
include at ./boot.jl:261
jl_apply_generic at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
include_from_node1 at ./loading.jl:333
jl_apply_generic at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
process_options at ./client.jl:284
_start at ./client.jl:378
unknown function (ip: 0x2ade1e05ae79)
jl_apply_generic at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
unknown function (ip: 0x401c87)
unknown function (ip: 0x40186f)
__libc_start_main at /lib64/libc.so.6 (unknown line)
unknown function (ip: 0x4018b5)
那么,我该如何捕捉它呢?看起来 sth 在我的 Julia 二进制文件中被破坏了,不是吗?有没有像 SIGINT 一样捕获 SIGTERM 的类似方法?即:
ccall(:jl_exit_on_sigint, Void, (Cint,), 0)
try
...
catch ex
println("caught something")
if isa(ex, InterruptException)
println("it was an interrupt")
end
end
我正在使用 Cent-OS 6.5.
简答:不能,请参阅 here。你引用的东西,jl_exit_on_sigint
是一个用julia/src/signal-handling.c
写的C函数。目前,他们还没有为 SIGTERM
编写处理程序,因此添加您自己的处理程序将意味着更改 Julia 的基础,并且他们没有公开任何 API 来处理一般信号。这主要是因为没有一种方法可以在不影响性能的情况下以一致的方式跨线程进行信号处理。
我在 julia-0.4.7 脚本中的 SIGTERM(不是 SIGINT)事件后得到以下堆栈跟踪:
signal (15): Terminate
write at /lib64/libpthread.so.0 (unknown line)
unknown function (ip: 0x2ade16a02893)
uv_write2 at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
jl_uv_write at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
uv_write at ./stream.jl:951
buffer_or_write at ./stream.jl:972
write at ./stream.jl:1011
print at ./char.jl:47
unknown function (ip: 0x2ade1e06d0a2)
jl_apply_generic at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
print at strings/io.jl:18
jl_apply_generic at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
jl_f_apply at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
println at strings/io.jl:25
jl_apply_generic at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
anonymous at /path/to/home/test.jl:4
unknown function (ip: 0x2ade169c5b13)
unknown function (ip: 0x2ade169c672c)
jl_load at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
include at ./boot.jl:261
jl_apply_generic at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
include_from_node1 at ./loading.jl:333
jl_apply_generic at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
process_options at ./client.jl:284
_start at ./client.jl:378
unknown function (ip: 0x2ade1e05ae79)
jl_apply_generic at /path/to/home/julia/bin/../lib/julia/libjulia.so (unknown line)
unknown function (ip: 0x401c87)
unknown function (ip: 0x40186f)
__libc_start_main at /lib64/libc.so.6 (unknown line)
unknown function (ip: 0x4018b5)
那么,我该如何捕捉它呢?看起来 sth 在我的 Julia 二进制文件中被破坏了,不是吗?有没有像 SIGINT 一样捕获 SIGTERM 的类似方法?即:
ccall(:jl_exit_on_sigint, Void, (Cint,), 0)
try
...
catch ex
println("caught something")
if isa(ex, InterruptException)
println("it was an interrupt")
end
end
我正在使用 Cent-OS 6.5.
简答:不能,请参阅 here。你引用的东西,jl_exit_on_sigint
是一个用julia/src/signal-handling.c
写的C函数。目前,他们还没有为 SIGTERM
编写处理程序,因此添加您自己的处理程序将意味着更改 Julia 的基础,并且他们没有公开任何 API 来处理一般信号。这主要是因为没有一种方法可以在不影响性能的情况下以一致的方式跨线程进行信号处理。