【问题标题】:Change the ruby process name in top更改顶部的 ruby​​ 进程名称
【发布时间】:2010-10-01 19:49:30
【问题描述】:

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

$0='miname'

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

【问题讨论】:

    标签: ruby linux unix top-command


    【解决方案1】:

    Dave Thomas 有一个有趣的post 在 Rails 中执行此操作。实际的进程名称更改代码没有任何特定的轨道。他使用$0='name' 方法。当我按照他的步骤操作时,名称更改为 pstop

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

    【讨论】:

    • 我试过 c 键盘命令,它适用于 Linux 机器。 Mac OS X 的 top 命令似乎没有等效选项。
    • 链接已失效 :( 你能显示一些代码吗?
    • web.archive.org 拯救生命:web.archive.org/web/20130415202502/http://…
    • 这就是为什么你不只是给出一个链接:)
    【解决方案2】:

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

    Process.setproctitle("My new title")
    

    【讨论】:

    • 我用的是linux,这个答案和`$0="My new title"一样,只是改变了ps的输出,不能和pgrep或者pkill一起工作。
    【解决方案3】:

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

    【讨论】:

    • 虽然这是一个很好的 FFI 示例,但您使用的函数根本无法移植。似乎只有freebsd,可能还有其他风格的bsd。没有 linux (glibc),没有 OS X,没有 Windows。
    【解决方案4】:

    $0 = 'Foo' 方法有效——但许多版本的 top 将要求您使用 'c' 切换命令行模式。我们在 Rails 和 CentOS 中使用了这种方法。工作一种享受

    【讨论】:

    • 那么,你是怎么做到的?
    【解决方案5】:

    我有一个类似的问题,通过将它放在机架中间件中,而不是之前/之后模式,稍微更新了 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

    【讨论】:

      【解决方案6】:

      我知道 Keltia 已经发布了一些非常相似的东西,但是 Linux 没有 setproctitle(3)。 Linux 从 2.6.9 版开始在 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
      

      【讨论】:

      • 在 Ruby 2.2.3 上,DL 已被弃用,需要更改一行代码。 DL::Handle 需要更改为 Fiddle::Handle 才能工作。这个答案可以在 linux 上完美运行,它不会改变 ps 输出,但可以与 pgrep 一起使用。
      【解决方案7】:

      来自@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')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-09
        • 2011-08-30
        • 1970-01-01
        • 2016-08-22
        • 1970-01-01
        • 1970-01-01
        • 2011-05-21
        相关资源
        最近更新 更多