更改ruby进程名称在顶部

我想改变显示在linux / unix top命令中的ruby进程的名字。 我试过了

$0='miname' 

的方法,但它只适用于ps命令,最上面的过程不断显示为“ruby”

Solutions Collecting From Web of "更改ruby进程名称在顶部"

戴夫托马斯有一个有趣的职位 ,在轨道做这个。 关于实际进程名称更改代码没有具体的轨道。 他使用$0='name'方法。 当我跟着他的脚步时,名字在pstop被改变了。

在这篇文章中,他建议使用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的技术稍微更新一下放在机架中间件上,而不是之前/之后的模式。

把它放在lib / rack / set_process_title.rb中:

 # 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 

…这在config / environment.rb的最后:

 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被测试。

  1. 它将改变ps top命令的输出。
  2. 它可以杀死或信号与pkill,pgrep,killall。

完善!

 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')