Changer le nom du processus ruby ​​en haut

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.

Mettez ceci dans 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 

… et cela se passe à la fin de config / environment.rb:

 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é.

  1. Cela changera la sortie dans la commande ps top.
  2. Cela peut être tuer ou signaler avec pkill, pgrep, killall.

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