Je voudrais changer le nom du processus ruby qui est affiché dans la commande linux / unix top. J’ai essayé le
$0='miname'
approche mais il ne fonctionne qu’avec la commande ps et en haut le processus continue à s’afficher comme “ruby”
Dave Thomas a publié un article intéressant sur les rails. Il n’y a rien de spécifique au code de changement de nom de processus. Il utilise l’approche $0='name'
. Quand j’ai suivi ses pas, le nom a été changé en ps
et en top
.
Dans le post, il suggère d’utiliser la commande c
keyboard si votre version de top n’affiche pas la version courte de la commande par défaut.
Ruby 2.1 a introduit une méthode Process.setproctitle
à cette fin:
Process.setproctitle("My new title")
Je ne pense pas que Ruby ait la fonctionnalité intégrée ( setproctitle(3)
). Vous devriez probablement essayer de regarder ruby-ffi et créer l’interface pour setproctitle(3)
.
EDIT: Je sais que vous avez votre réponse mais je veux vous montrer du code pour utiliser ffi:
require "ffi" # module LibC extend FFI::Library attach_function :setproctitle, [:ssortingng, :varargs], :void end LibC.setproctitle("Ruby: executing %s", :ssortingng, $0)
Ne fonctionne pas sous OS X car setproctitle(3)
n’existe pas, fonctionne sur FreeBSD.
La méthode $ 0 = ‘Foo’ fonctionne – mais de nombreuses versions de top vous obligeront à activer le mode ligne de commande avec ‘c’. Nous avons cette méthode ici avec les rails et CentOS. Travaille un régal
J’ai eu un problème similaire, mis à jour la technique du post de Dave Thomas un peu en le mettant dans un middleware de rack, plutôt que le pattern avant / après.
# 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
Plus de mots dans l’article du blog: http://blog.actbluetech.com/2011/06/set-your-process-name-in-top-and-ps.html
Je sais que Keltia a déjà posté quelque chose de très similaire, mais Linux n’a pas setproctitle (3). Linux a cette fonctionnalité dans prctl () depuis la version 2.6.9. J’ai utilisé Fiddle / DL car ils sont inclus par défaut avec 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
De @jessehz répond, le code suivant fonctionne parfaitement sur mon linux X86_64. Ruby 1.9.3, 2.0, 2.1, 2.2, 2.3 est testé.
Parfait!
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')