
Estou tentando alterar a saída lsof -i4TCP:PORT
para incluir um nome personalizado. Isso me ajudará a identificar o processo do servidor iniciado pelo meu daemon. Abaixo está uma imagem com uma seta apontando para o que eu gostaria de controlar.
Criei uma gem personalizada, executei o processo lá e ainda diz Ruby. Em vez de descer pela 'toca do coelho', perguntando-se se mais alguém teve essa necessidade. Basicamente, gostaria de fazer exatamente o que o docker fez e mostrar o processo marcado com o nome do meu programa.
Responder1
Você precisa definir o nome do processo. Em alguns sistemas, atribuir um valor a $0
funcionaria, mas não no Linux (pelo menos não com a minha versão do ruby
), onde ruby
apenas define a lista de argumentos (como visto em ps -f
ou ps -o args
), mas não o nome do processo (como em lsof
ou ps
/ ps -o comm
) ( perl -e '$0 = "foo"'
funcionaria work as perl
define o nome do processo e a lista de argumentos).
Para isso, no Linux, você precisa fazer:
prctl(PR_SET_NAME, "newname")
chamada do sistema.
Embora você possa fazer:
$ 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
O valor da chamada do sistema dependeria da arquitetura (aqui 157 para AMD64).
No entanto, procurar prctl
no código-fonte de ruby
não traz nada, então suspeito que não haja suporte pronto para uso em ruby
. Process.setproctitle()
também não define o nome do processo.
@Jessehz no SO tem uma solução usandofiddle
para fazer uma chamada para a pctrl()
função na biblioteca C (assumindo um link dinâmico, ruby
suponho):
$ 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
Responder2
Obrigado a @Stéphane pela ótima resposta. Mas no meu caso a melhor solução foi agrupar meus scripts como um aplicativo Mac OSX. Você pode controlar o nome do seu processo no Info.plist do seu projeto.