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

3

Estou tentando alterar a saída de lsof -i4TCP:PORT para incluir um nome personalizado. Isso me ajudará a identificar o processo do servidor iniciado pelo meu daemon. Abaixo está uma foto com a seta apontando para o que eu gostaria de controlar.

Eu criei uma gem customizada, executei o processo lá e ela ainda diz Ruby. Em vez de descer a "toca do coelho", imaginando se alguém mais teve essa necessidade. Eu gostaria essencialmente de fazer exatamente o que a janela de encaixe fez e mostrar o processo marcado com o nome do meu programa.

    
por iangolden 18.05.2017 / 22:17

2 respostas

0

Obrigado a @ Stéphane pela ótima resposta. Mas no meu caso, a melhor solução foi agrupar meus scripts como um aplicativo do Mac OSX. Você pode controlar o nome do seu processo no Info.plist do seu projeto.

    
por 20.05.2017 / 05:16
0

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 na minha versão de ruby ), em que ruby apenas define a lista arg (conforme 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 como perl define o nome do processo e a lista de argumentos).

Para isso, no Linux, você precisa fazer um:

prctl(PR_SET_NAME, "newname")

chamada do sistema.

Enquanto você poderia 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 seria dependente da arquitetura (aqui 157 para amd64).

No entanto, o grepping para prctl no código-fonte de ruby não traz nada, então suspeito que não haja suporte pronto para isso em ruby . Process.setproctitle() também não define o nome do processo.

@Jessehz no SO tem uma solução usando fiddle para fazer uma chamada para a função pctrl() na biblioteca C (assumindo um ruby dinamicamente vinculado, 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
    
por 19.05.2017 / 17:20