在顶部更改ruby进程名称

时间:2009-01-16 14:54:34

标签: ruby linux unix top-command

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

$0='miname'

方法,但它只适用于ps命令,并且在顶部,该过程一直显示为“ruby”

7 个答案:

答案 0 :(得分:17)

Dave Thomas在rails中做了一个有趣的post。关于实际进程名称更改代码没有特定的rails。他使用$0='name'方法。当我按照他的步骤操作时,pstop更改了名称。

在帖子中他建议使用c键盘命令,如果您的top版本默认情况下没有显示该命令的短版本。

答案 1 :(得分:10)

Ruby 2.1 introduced用于此目的的Process.setproctitle方法:

Process.setproctitle("My new title")

答案 2 :(得分:9)

我认为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。

答案 3 :(得分:2)

$ 0 ='Foo'方法有效 - 但许多版本的top需要您使用'c'切换命令行模式。我们这里的方法有rails和CentOS。是一种享受

答案 4 :(得分:2)

我遇到了类似的问题,将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

答案 5 :(得分:2)

我知道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

答案 6 :(得分:0)

从@jessehz回答,以下代码在我的linux X86_64上完美运行。 测试了Ruby 1.9.3,2.0,2.1,2.2,2.3。

  1. 它会改变ps top命令的输出。
  2. 可以用pkill,pgrep,killall杀死或发信号。
  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')