linux/unix の top コマンドで表示される ruby プロセスの名前を変更したいです。私は試してみました
$0='miname'
アプローチですが、psコマンドでのみ機能し、上部のプロセスは「ruby」として表示され続けます
linux/unix の top コマンドで表示される ruby プロセスの名前を変更したいです。私は試してみました
$0='miname'
アプローチですが、psコマンドでのみ機能し、上部のプロセスは「ruby」として表示され続けます
Dave Thomas は、レールでこれを行うことについて興味深い投稿をしました。実際のプロセス名の変更コードについて、レール固有のものは何もありません。彼は$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' メソッドは機能しますが、top の多くのバージョンでは、'c' でコマンドライン モードをオンにする必要があります。ここでは、Rails と CentOS を使用してこの方法を実行します。御馳走を働きます
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
同様の問題があり、前/後のパターンではなく、ラックミドルウェアに入れて、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
@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')