
Я пытаюсь изменить вывод, lsof -i4TCP:PORT
включив пользовательское имя. Это поможет мне идентифицировать процесс сервера, запущенный моим демоном. Ниже приведен рисунок со стрелкой, указывающей на то, что я хотел бы контролировать.
Я создал пользовательский gem, выполнил процесс там, и он все еще говорит Ruby. Вместо того, чтобы спускаться в «кроличью нору», гадая, была ли у кого-то еще такая потребность. Я бы по сути хотел сделать то же самое, что сделал docker, и показать процесс, помеченный именем моей программы.
решение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 вашего проекта.