我想更改linux / unix top命令中显示的ruby进程的名称。我试过了
$0='miname'
方法,但它只适用于ps命令,并且在顶部,该过程一直显示为“ruby”
答案 0 :(得分:17)
Dave Thomas在rails中做了一个有趣的post。关于实际进程名称更改代码没有特定的rails。他使用$0='name'
方法。当我按照他的步骤操作时,ps
和top
更改了名称。
在帖子中他建议使用c
键盘命令,如果您的top版本默认情况下没有显示该命令的短版本。
答案 1 :(得分:10)
Ruby 2.1 introduced用于此目的的Process.setproctitle
方法:
Process.setproctitle("My new title")
答案 2 :(得分:9)
我认为Ruby没有内置设施(setproctitle(3)
)。您可能应该尝试查看ruby-ffi并创建setproctitle(3)
的接口。
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的技术更新为机架中间件,而不是前/后模式。
# 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
答案 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。
完美!
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')