ruby linux unix top-command

Cambie el nombre del proceso Ruby en la parte superior



linux unix (7)

Dave Thomas tuvo una publicación interesante sobre cómo hacer esto en los rieles. No hay nada específico sobre el código de cambio de nombre del proceso. Él usa el enfoque $0=''name'' . Cuando seguí sus pasos, el nombre fue cambiado en ps y top .

En la publicación, sugiere usar el comando c teclado si su versión de arriba no muestra la versión corta del comando de forma predeterminada.

Me gustaría cambiar el nombre del proceso de ruby ​​que se muestra en el comando superior linux / unix. He intentado el

$0=''miname''

enfoque pero solo funciona con el comando ps y en la parte superior el proceso se sigue mostrando como "ruby"


No creo que Ruby tenga la instalación setproctitle(3) ). Probablemente deberías tratar de mirar a ruby-ffi y crear la interfaz para setproctitle(3) .

EDITAR: Sé que tienes tu respuesta, pero quiero mostrarte un código para usar ffi:

require "ffi" # module LibC extend FFI::Library attach_function :setproctitle, [:string, :varargs], :void end LibC.setproctitle("Ruby: executing %s", :string, $0)

No funciona en OS X porque setproctitle(3) no existe, funciona en FreeBSD.


El método $ 0 = ''Foo'' funciona, pero muchas versiones de la parte superior requieren que se active el modo de línea de comandos con ''c''. Tenemos este mismo método aquí con rieles y CentOS. Funciona una delicia


Tuve un problema similar, actualicé la técnica de la publicación de Dave Thomas un poco poniéndola en un middleware de rack, en lugar del patrón before / after.

Pon esto en 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

... y esto va al final de config / environment.rb:

Rails.configuration.middleware.insert_after Rack::Lock, Rack::SetProcessTitle

Más palabras en la publicación del blog: http://blog.actbluetech.com/2011/06/set-your-process-name-in-top-and-ps.html



Desde la respuesta de @jessehz, el siguiente código funciona perfectamente en mi linux X86_64. Ruby 1.9.3, 2.0, 2.1, 2.2, 2.3 está probado.

  1. Cambiará la salida en el comando ps top.
  2. Puede ser kill o signal con pkill, pgrep, killall.

¡Perfecto!

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'')


Sé que Keltia ya publicó algo muy similar, pero Linux no tiene setproctitle (3). Linux ha tenido esta funcionalidad en prctl () desde la versión 2.6.9. Utilicé Fiddle / DL ya que están incluidos por defecto con 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