Дать процессу конкретное имя в GNU / Linux?

10

Как запустить процесс, чтобы он имел определенный идентификатор в psкоманде?

UPD : у меня есть пара серверов, работающих на одном компьютере. Большинство из них находятся в режиме развертывания. Однако один находится в разработке. Все серверы являются Pythonic, и болезнь состоит в том, что все серверы перечислены как pythonв ps, что делает невозможным для killallодного в разработке, оставляя другие нетронутыми.

UPD : Как предложили Дэвид и GNUix, я создал символические ссылки на интерпретатор Python и сценарии bash для каждого сервера.

Alex
источник

Ответы:

7

Создание символической ссылки должно помочь, однако, было бы более полезно, если бы мы знали болезнь, а не симптом. Что именно ты пытаешься сделать? Потому что может быть лучший способ

gnuix@defiant)-(08:11pm-:-06/10)--
(~)./0012
my weird program name
  PID TTY          TIME CMD
 7805 pts/1    00:00:00 zsh
14020 pts/1    00:00:00 0012
14021 pts/1    00:00:00 ps
(gnuix@defiant)-(08:11pm-:-06/10)--
(~)ln -s 0012 weird
(gnuix@defiant)-(08:12pm-:-06/10)--
(~)./weird 
my weird program name
  PID TTY          TIME CMD
 7805 pts/1    00:00:00 zsh
14046 pts/1    00:00:00 weird
14047 pts/1    00:00:00 ps
(gnuix@defiant)-(08:12pm-:-06/10)--
(~)

Обновление: основываясь на дополнительной информации, которую вы могли бы (я уверен, что есть более простой способ, но в данный момент он не приходит ко мне), ваши серверы записывают свои PID в файл при запуске, тогда вы можете убить -9 | cat /var/run/devserver.pid, но тогда это будет вопрос программирования :)

Обновление еще раз: Вы также можете сделать некоторые хитрости оболочки, чтобы получить PID серверов, когда вы их запускаете. Вдобавок ко всему, вы можете создать функцию оболочки, называемую startmyserver, например, которая обернет команду, которую вы используете для запуска ваших серверов, но также захватить $! в файл, основанный на имени запуска - тогда мы говорим о сценариях оболочки, которые 'inbounds' @ ServerFault. :-)

GNUix
источник
4

Вы можете переименовать бинарный файл, который собираетесь запустить. Вы можете уйти, просто используя символическую ссылку на двоичный файл.

Если вы действительно хотите изменить имя, лучше всего использовать простую обертку, которая устанавливает argv, а затем исполняет процесс, который вы хотите запустить. Сейчас у меня нет времени, чтобы дать вам пример кода, но выкрикните громко через 10 часов, и я посмотрю, что я могу сделать.

Дэвид Пашли
источник
именно моя точка зрения. Вам нужен код для этого (кроме переименования / (sym), связывающего двоичный файл, который может быть проблематичным, если он проверяет argv [0])
Martin M.
Некоторые бинарные файлы не будут работать хорошо , если вы в основном встроенные (BusyBox, Dropbear)
nhed
3

Посмотрите на https://github.com/electrum/procname . Это позволяет вам устанавливать имя процесса любого процесса, используя переменную окружения.

Применение:

Запустите Java с установленными переменными среды LD_PRELOAD и PROCNAME:

LD_PRELOAD = / путь / к / libprocname.so PROCNAME = привет java -jar foo.jar

itsadok
источник
2

Это на самом деле не относится к SO, потому что это общий вопрос, а не язык.

Короткий ответ не легко. То есть это не может быть сделано изнутри функциональности вашей оболочки или procfs / sysfs. Вам нужно будет использовать внешнюю утилиту для достижения этой цели.

Существует длинное описание того, как и почему здесь . Осторожно, это довольно С-центрично.

Обновить:

Они питон, который меняет игру. Без того, чтобы быть слишком SO, вероятно, было бы легче изменить их, чтобы использовать этот модуль или подобный подход.

Дэн Карли
источник
прикосновение .. Я знал, что есть более легкий путь :)
GNUix
Код на C гораздо более многословен, чем должен быть из-за объема вывода, который он делает. Должно быть возможно уменьшить это, но это делает почти то же самое, что я предлагал. Только с некоторым кодом, чтобы пойти с ним :) Бит, которого не хватает, это исполняющий код для запуска вашего кода :)
Дэвид Пашли