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

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

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

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

Выход LSOF

решение1

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

Для этого в 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).

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

@Jessehz на 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

решение2

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

Связанный контент