¿Cómo puedo cambiar el título del comando cuando ejecuto un servidor?

¿Cómo puedo cambiar el título del comando cuando ejecuto un servidor?

Estoy intentando cambiar el resultado de lsof -i4TCP:PORTpara incluir un nombre personalizado. Esto me ayudará a identificar el proceso del servidor iniciado por mi demonio. A continuación se muestra una imagen con una flecha que apunta a lo que me gustaría controlar.

Creé una gema personalizada, ejecuté el proceso allí y todavía dice Ruby. En lugar de hundirse en la 'madriguera del conejo', preguntándose si alguien más ha tenido esta necesidad. Básicamente, me gustaría hacer exactamente lo que ha hecho Docker y mostrar el proceso etiquetado con el nombre de mi programa.

salida LSOF

Respuesta1

Debe configurar el nombre del proceso. En algunos sistemas, asignar un valor a $0funcionaría, pero no en Linux (al menos no con mi versión de ruby) donde rubysolo establece la lista de argumentos (como se ve en ps -fo ), pero no ps -o argsel nombre del proceso (como en lsofo ps/ ps -o comm) ( perl -e '$0 = "foo"'funciona como perlestablece tanto el nombre del proceso como la lista de argumentos).

Para eso, en Linux, necesitas hacer:

prctl(PR_SET_NAME, "newname")

llamada al sistema.

Si bien podrías hacer:

$ ruby -e 'syscall(157, 15, "foo"); system("ps")'
  PID TTY          TIME CMD
5679 pts/4    00:00:01 zsh
8639 pts/4    00:00:00 foo
8641 pts/4    00:00:00 ps

El valor de la llamada al sistema dependería de la arquitectura (aquí 157 para amd64).

Sin embargo, buscar prctlen el código fuente de rubyno aporta nada, por lo que sospecho que no hay soporte listo para usar para ello en ruby. Process.setproctitle()Tampoco establece el nombre del proceso.

@Jessehz en SO tiene una solución usandofiddlepara hacer una llamada a la pctrl()función en la biblioteca C (suponiendo que esté vinculada dinámicamente, rubysupongo):

$ ruby -e 'require "fiddle"; Fiddle::Function.new(
  Fiddle::Handle["prctl".freeze], [Fiddle::TYPE_INT, Fiddle::TYPE_VOIDP],
  Fiddle::TYPE_INT).call(15, "foo"); system("ps")'
  PID TTY          TIME CMD
 5931 pts/5    00:00:02 zsh
 8943 pts/5    00:00:00 foo
 8945 pts/5    00:00:00 ps

Respuesta2

Gracias a @Stéphane por la gran respuesta. Pero en mi caso, la mejor solución fue agrupar mis scripts como una aplicación para Mac OSX. Puede controlar el nombre de su proceso en Info.plist de su proyecto.

información relacionada