Назад | Перейти на главную страницу

Можно ли изменить командную строку запущенного процесса (например, чтобы ее было легче идентифицировать вверху)?

Я запускаю несколько Linux-серверов с VMware Server 2. Когда время их отклика не такое большое или средняя нагрузка возрастает, я открываю top чтобы узнать, что происходит, или для наших производственных серверов у меня есть top открыт весь день. Проблема в том, что командная строка vmware-vmx процессы действительно длинные, например:

/usr/lib/vmware/bin/vmware-vmx -# product=2;name=VMware Server;version=2.0.2;buildnumber=203138;licensename=VMware GSX Server for Linux;licenseversion=3.0 build-203138; -@ pipe=/tmp/vmhsdaemon-0/vmxaf9a31943e9065f0;readyEvent=55 /var/lib/vmware/Virtual Machines/Kyle.vmwarevm/Kyle.vmx

Так что в top все, что я вижу, это:

 4135 root      20   0  593m 324m 289m S   21  4.2   3038:04 /usr/lib/vmware/bin/vmware-vmx -# product=2;name=VMware Server;
 4106 root      10 -10  997m 399m 346m S    9  5.1   1135:25 /usr/lib/vmware/bin/vmware-vmx -# product=2;name=VMware Server;
 4074 root      20   0  833m 110m  97m S    2  1.4 722:19.38 /usr/lib/vmware/bin/vmware-vmx -# product=2;name=VMware Server;

В VMWare Server 1 каждая виртуальная машина будет работать как собственный пользователь, поэтому я легко могу сказать, какая из них была какой. Не так с VMWare Server 2. Можно ли вместо покупки действительно широкого монитора или установки с тройным монитором изменить командную строку этих запущенных процессов, чтобы я мог легко определить, какой из них какой? Я знаю, что процессы могут изменять командную строку сами по себе ... и я могу читать (но не писать) /proc/nnn/cmdline...

Есть ли способ (как root) изменить командную строку запущенного процесса?

Хотя, вероятно, никто больше не собирается использовать VMWare Server, эта проблема возникнет и с другими процессами. Ты настоящий должен смотреть на htop вместо этого он позволяет при боковой прокрутке читать всю командную строку и отображает деревья процессов:

Что касается вашего вопроса, изменение командной строки процесса, который уже запущен, вероятно, будет возможно только путем перезаписи данных по адресу памяти его ARGV [0]. Насколько мне известно, еще нет инструмента, который бы changecmdline 4652 "foo process". Дальнейшее обсуждение: http://stupefydeveloper.blogspot.de/2008/10/linux-change-process-name.html

Это действительно досадная проблема.

Настоящее решение размещено здесь:

http://blog.angulosolido.pt/2012/01/vmware-2-long-process-names-and-top.html

Скрипт НЕ красивый, но он работает.

Как насчет следующего:

watch 'ps -eo pid,pcpu,args | grep vmware'

Часы будут запускать команду каждые 2 секунды. pcpu процент процессора.

Короткий ответ, я не думаю, что это возможно без перекомпиляции ядра. Я проверил верх, и он определенно тянет его из / proc:
strace top -c 2>&1 | grep "proc"
open("/proc/6501/stat", O_RDONLY) = 4
open("/proc/6501/statm", O_RDONLY) = 4
open("/proc/6501/cmdline", O_RDONLY) = 4

Как вы говорите, / proc / pid / cmdline не может быть записан root. Вы не думали запускать их с помощью программы-оболочки? например. bash скрипт ./vmware, который просто выполняет
/usr/lib/vmware/bin/vmware-vmx -# product=2;name=VMware Server;version=2.0.2;buildnumber=203138;licensename=VMware GSX Server for Linux;licenseversion=3.0 build-203138; -@ pipe=/tmp/vmhsdaemon-0/vmxaf9a31943e9065f0;readyEvent=55 $1"

Стоит отметить, что верхняя часть обрезается только тогда, когда на ней нет места. Почему бы не открыть верх, нажать f и удалить все поля, которые вы не используете. Вы можете просто обнаружить, что он оставляет достаточно места для всей командной строки

Не прямой ответ на ваш вопрос, но, возможно, ответ на вашу проблему:

  1. Используйте LSOF, чтобы узнать, какие PID используют какие VMDK
  2. Используйте ps и grep для этих PID

Это может быть легко написано сценарием, хотя у меня сейчас нет открытой консоли Linux. Упражнение оставлено читателю.

#!/bin/bash

DELAY=2
DIRNAME=virtual

while true; do
    clear; ps -eo pid,pcpu,args | grep vmx|grep $DIRNAME  |awk '{ print $1 " " $2 " " $NF}'| sort -rn -k 2; sleep $DELAY;
done

Попробуй это:

#!/bin/sh
A=`ps -e -o pid,cmd| grep vmware-vmx | grep -v match | awk 'BEGIN {print "{" } {gsub(/^.*\//, "", $NF); print "if (match($0, / *" $1 " /)) { sub(\"vmware-vmx          \",\"" "%-20s" "\",$0); printf($0,\"" $NF "\"); print \"\";} else "} END {print "print $0 }"}'`
top | awk "$A"

Сценарий работает как фильтр для вывода TOP и заменяет vmware-vmx именем виртуальной машины. Предполагается, что файл .vmx содержит не более 20 символов. Это потому, что вам нужно сохранить размер линии, созданный с помощью top.