我想改变显示在linux / unix top命令中的ruby进程的名字。 我试过了
$0='miname'
的方法,但它只适用于ps命令,最上面的过程不断显示为“ruby”
戴夫托马斯有一个有趣的职位 ,在轨道做这个。 关于实际进程名称更改代码没有具体的轨道。 他使用$0='name'
方法。 当我跟着他的脚步时,名字在ps
和top
被改变了。
在这篇文章中,他建议使用c
键盘命令,如果你的top版本默认不显示命令的短版本。
Ruby 2.1为此引入了一个Process.setproctitle
方法:
Process.setproctitle("My new title")
我不认为Ruby有内置的工具( setproctitle(3)
)。 你也许应该试试看ruby-ffi并创建接口来设置setproctitle(3)
。
编辑:我知道你有你的答案,但我想告诉你一些代码使用ffi:
require "ffi" # module LibC extend FFI::Library attach_function :setproctitle, [:string, :varargs], :void end LibC.setproctitle("Ruby: executing %s", :string, $0)
在OS X上不起作用,因为setproctitle(3)
不存在,在FreeBSD上工作。
$ 0 ='Foo'方法有效 – 但是顶部的许多版本都需要你用'c'来切换命令行模式。 我们在这里用rails和CentOS这个方法。 作品一种享受
我也有类似的问题,把Dave Thomas的技术稍微更新一下放在机架中间件上,而不是之前/之后的模式。
# Set the process title to the URI being processed #- useful for debugging slow requests or those that get stuck class Rack::SetProcessTitle def initialize(app) @app = app end def call(env) $0 = env['REQUEST_URI'][0..80] @status, @headers, @response = @app.call(env) $0 = env['REQUEST_URI'][0..80] + '*' [@status, @headers, @response] end end
Rails.configuration.middleware.insert_after Rack::Lock, Rack::SetProcessTitle
更多的话在博客文章: http : //blog.actbluetech.com/2011/06/set-your-process-name-in-top-and-ps.html
我知道Keltia已经发布了非常相似的东西,但是Linux没有setProctitle(3)。 从2.6.9版开始,Linux在prctl()中已经有了这个功能。 我使用了Fiddle / DL,因为它们默认包含在Ruby中。
require("fiddle") def set_process_name_linux(name) Fiddle::Function.new( Fiddle::Handle["prctl".freeze], [ Fiddle::TYPE_INT, Fiddle::TYPE_VOIDP, Fiddle::TYPE_LONG, Fiddle::TYPE_LONG, Fiddle::TYPE_LONG ], Fiddle::TYPE_INT ).call(15, name, 0, 0, 0) end def set_process_name_unknown(name) warn("No implementation for this OS.".freeze) end def set_process_name(name) case RUBY_PLATFORM.split("-".freeze)[1] when "linux".freeze set_process_name_linux(name) else set_process_name_unknown(name) end end
从@jessehz回答,下面的代码在我的linux X86_64上完美工作。 Ruby 1.9.3,2.0,2.1,2.2,2.3被测试。
完善!
def set_process_name_linux(name) handle = defined?(DL::Handle) ? DL::Handle : Fiddle::Handle Fiddle::Function.new( handle['prctl'.freeze], [ Fiddle::TYPE_INT, Fiddle::TYPE_VOIDP, Fiddle::TYPE_LONG, Fiddle::TYPE_LONG, Fiddle::TYPE_LONG ], Fiddle::TYPE_INT ).call(15, name, 0, 0, 0) $PROGRAM_NAME = name end set_process_name_linux('dummy')