Как получить имя хоста отправителя сигнала об убийстве в сценарии systemtap

все, я сталкиваюсь с проблемой при использовании скрипта systemtap. Я не знаю, как получить имя хоста отправителя сигнала уничтожения в сценарии systemtap. Например. Я выполняю kill -9 xclock_process_pid на сервере 'sf1'. в то же время я запускаю 1.stap -x xclock_process_pid для мониторинга xclock, есть ли способ получить имя сервера «sf1» в сценарии systemtap при отправке kill -9 xclock_process_pid в «sf1»?

но я столкнулся с некоторой проблемой. мой 1.stap показан ниже:

#!/usr/bin/env stap
function hostname:string () %{
    STAP_RETURN(current->nsproxy->uts_ns->name.nodename); 
%}
probe oneshot {
    log(hostname())
}

когда я запускаю «stap -g 1.stap», выдается следующая ошибка. Не могли бы вы мне помочь? семантическая ошибка: несоответствие контрольной точки в позиции 0 (альтернативы: __nfs __scheduler __signal __tcpmib __vm _linuxmib _signal _sunrpc _syscall _vfs begin begin (number) end end (number) error error (number) generic ioblock ioblock_trace ioscheduler ioscheduler_trace kernel ioscheduler_trace ipmib irq_hand string) nd_syscall netdev never nfs nfsd perf process process(number) process(string) procfs procfs(string) scheduler scsi signal socket softirq stap staprun sunrpc syscall tcp tcpmib timer tty udp vfs vm workqueue): идентификатор 'oneshot' at systemtap.stap: 87:7 при разрешении источника пробной точки ваншота: зонд ваншот { ^ Проход 2: анализ не пройден. Попробуйте еще раз с другой опцией '--vp 01'.


person user1102185    schedule 30.11.2016    source источник


Ответы (1)


Другими словами, вы спрашиваете, как получить имя хоста текущей машины. Имя хоста уровня TCP/IP недоступно. Достичь имени уровня sethostname(2) непросто, поскольку оно скрыто внутри переменных ядра за заблокированными полями utsname()->.

Если бы безопасность не была проблемой, вы могли бы сделать это с помощью встроенной функции C для ядер эпохи 4.8:

function hostname:string () %{
    STAP_RETURN(current->nsproxy->uts_ns->name.nodename); 
%}
probe oneshot {
    log(hostname())
}

который вы бы запускали с stap -g ... (режим гуру).

person fche    schedule 09.12.2016
comment
Большое спасибо во-первых. - person user1102185; 13.12.2016
comment
когда я запускаю 'stap -g 1.stap', будет повторяться вышеуказанная ошибка. Не могли бы вы помочь мне проверить? - person user1102185; 15.12.2016
comment
Хорошо, ваша версия systemtap должна быть старше 2.5 (2014-04-30), когда был добавлен псевдоним oneshot probe. Вместо этого используйте probe begin { log(....); exit() } . - person fche; 15.12.2016
comment
когда я использую зонд begin { log(....); exit() } , сообщит о другой ошибке: /tmp/stap7gFv8k/stap_169fxx4_802_src.c: В функции 'function_hostname': /tmp/stap7gFv8k/stap_16yyeb4_802_src.c:211: ошибка: неявное объявление функции 'STAP_RETURN' /tmp/stap7gFv8k/ stap_zz_src.c:211: ошибка: 'struct task_struct' не имеет члена с именем 'nsproxy' ] Ошибка 2 Предупреждение: make завершил работу со статусом: 2 Проход 4: компиляция не удалась. Попробуйте еще раз с другой опцией '--vp 0001'. - person user1102185; 18.12.2016
comment
моя версия systemtap 1.6. ОС RedHat5.8 - person user1102185; 18.12.2016
comment
Ваша версия systemtap слишком старая для запуска на этом ядре. Red Hat выпустила как минимум версию 1.8 для RHEL5, и для RHEL5 может быть создана более поздняя версия исходного кода. - person fche; 19.12.2016