22

linux/unix の top コマンドで表示される ruby​​ プロセスの名前を変更したいです。私は試してみました

$0='miname'

アプローチですが、psコマンドでのみ機能し、上部のプロセスは「ruby」として表示され続けます

4

7 に答える 7

17

Dave Thomas は、レールでこれを行うことについて興味深い投稿をしました。実際のプロセス名の変更コードについて、レール固有のものは何もありません。彼は$0='name'アプローチを使用します。彼の手順に従ってみたら、 と で名前が変更されましpstop

投稿ではc、top のバージョンがデフォルトで短いバージョンのコマンドを表示しない場合、キーボード コマンドを使用することを提案しています。

于 2009-01-16T19:40:59.540 に答える
10

Ruby 2.1では、この目的のためのメソッドが導入されました。Process.setproctitle

Process.setproctitle("My new title")
于 2015-03-12T17:58:51.423 に答える
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 では動作します。

于 2009-01-16T15:07:17.173 に答える
2

$0 = 'Foo' メソッドは機能しますが、top の多くのバージョンでは、'c' でコマンドライン モードをオンにする必要があります。ここでは、Rails と CentOS を使用してこの方法を実行します。御馳走を働きます

于 2010-05-21T22:01:24.593 に答える
2

Keltia がすでに非常によく似たものを投稿していることは知っていますが、Linux には setproctitle(3) がありません。Linux では、バージョン 2.6.9 以降、prctl() にこの機能がありました。Ruby にデフォルトで含まれているため、Fiddle/DL を使用しました。

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
于 2012-05-09T20:33:09.867 に答える
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

于 2011-06-09T18:34:52.787 に答える
0

@jessehzの回答から、次のコードは私のLinux X86_64で完璧に機能します。Ruby 1.9.3、2.0、2.1、2.2、2.3 がテストされています。

  1. ps top コマンドの出力を変更します。
  2. これは、pkill、pgrep、killall を使用して kill または signal にすることができます。

完全!

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')
于 2016-03-15T16:19:25.870 に答える