Como posso alterar o título do comando ao executar um servidor?

Como posso alterar o título do comando ao executar um servidor?

Estou tentando alterar a saída lsof -i4TCP:PORTpara 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.

Saída LSOF

Responder1

Você precisa definir o nome do processo. Em alguns sistemas, atribuir um valor a $0funcionaria, mas não no Linux (pelo menos não com a minha versão do ruby), onde rubyapenas define a lista de argumentos (como visto em ps -fou ps -o args), mas não o nome do processo (como em lsofou ps/ ps -o comm) ( perl -e '$0 = "foo"'funcionaria work as perldefine 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 prctlno código-fonte de rubynã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 usandofiddlepara fazer uma chamada para a pctrl()função na biblioteca C (assumindo um link dinâmico, rubysuponho):

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

informação relacionada