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
Ruby 2.1 introdujo un método Process.setproctitle
para este propósito:
Process.setproctitle("My new title")
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.
- Cambiará la salida en el comando ps top.
- 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