
Estoy intentando cambiar el resultado de lsof -i4TCP:PORT
para 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.
Respuesta1
Debe configurar el nombre del proceso. En algunos sistemas, asignar un valor a $0
funcionaría, pero no en Linux (al menos no con mi versión de ruby
) donde ruby
solo establece la lista de argumentos (como se ve en ps -f
o ), pero no ps -o args
el nombre del proceso (como en lsof
o ps
/ ps -o comm
) ( perl -e '$0 = "foo"'
funciona como perl
establece 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 prctl
en el código fuente de ruby
no 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 usandofiddle
para hacer una llamada a la pctrl()
función en la biblioteca C (suponiendo que esté vinculada dinámicamente, ruby
supongo):
$ 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.