Как изменить заголовок команды при запуске сервера?

Я пытаюсь изменить вывод lsof -i4TCP:PORT чтобы включить пользовательское имя. Это поможет мне идентифицировать процесс сервера, который был запущен моим демоном. Ниже изображена стрелка, указывающая на то, что я хотел бы контролировать.

Я создал собственный камень, выполнил там процесс, и он все еще говорит Ruby. Вместо того, чтобы спуститься по «кроличьей дыре», интересно, есть ли у кого-то еще такая необходимость. Я хотел бы сделать именно то, что сделал докер, и показать процесс, отмеченный моим именем программы.

Выход LSOF

2 Solutions collect form web for “Как изменить заголовок команды при запуске сервера?”

Вам нужно установить имя процесса. В некоторых системах присвоение значения $0 будет работать, но не в Linux (по крайней мере, не с моей версией ruby ), где ruby устанавливает только список arg (как показано в ps -f или ps -o args ), но не имя процесса (как в lsof или ps / ps -o comm ) ( perl -e '$0 = "foo"' будет работать как perl устанавливает как имя процесса, так и список arg).

Для этого в Linux вам необходимо выполнить:

 prctl(PR_SET_NAME, "newname") 

системный вызов.

Хотя вы могли бы сделать:

 $ 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 

Значение системного вызова будет зависящим от архитектуры (здесь 157 для amd64).

Однако grepping для prctl в исходном коде ruby не приносит ничего, поэтому я подозреваю, что в ruby нет никакой поддержки. Process.setproctitle() также не устанавливает имя процесса.

@Jessehz on SO имеет решение, использующее fiddle для вызова функции pctrl() в библиотеке C (предположим, что динамически связанный ruby я полагаю):

 $ 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 

Спасибо @ Stéphane за отличный ответ. Но в моем случае лучшим решением было расслоение моих сценариев в качестве приложения Mac OSX. Вы можете управлять своим именем процесса в Info.plist вашего проекта.

  • Является ли это ядро ​​предупреждением о серьезной проблеме, которая нуждается в моем внимании?
  • tcpdump не захватывает трафик http или tcp / ssl
  • Неупорядоченный ответ ACK
  • Как я могу определить, какая программа или пользователь подключен к определенному порту после факта?
  • nc: bind failed: адрес уже используется
  • Изменение значения TCP RTO в Linux
  • Почему некоторые пакеты сброса TCP отображаются в моем журнале iptables?
  • Ошибка: «TCP_NODELAY» не был объявлен в этой области
  • Как записывать сеанс TCP / TLS в societ socat?
  • Linux TCP стек не пересылает данные в мое приложение
  • Отправить пакет TCP на тот же источник
  • Linux и Unix - лучшая ОС в мире.