Как определить, какой хост генерировал базовый файл?

Это может быть сделано от find непосредственно использование -exec:

find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;

Чему передается -exec будет вызван однажды на файл, найденный с шаблонными параметрами {} будучи замененным текущим именем файла. \; на конце команды находки только завершает строку.

Использование xargs не действительно необходимо в этом случае, потому что мы должны вызвать xmllint однажды на файл как оба входные и выходные имена файлов должны быть указаны в том же вызове.

xargs был бы необходим, если бы команда, передаваемая по каналу к от находки, работала над несколькими файлами за один раз, и тот список был длинен. Вы не можете сделать этого в этом случае, поскольку необходимо передать единственное имя файла --output опция xmllint. Без xargs Вы могли заканчивать со "Списком аргументов слишком долго" ошибка при обработке большого количества файлов. xargs также строки замены файла поддержек с -I опция:

find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'

Сделал бы то же как find -exec команда выше. Если какая-либо из Ваших папок будет иметь нечетные символы в подобных пробелах, то необходимо будет использовать -0 опции find и xargs. Но использование xargs с -I подразумевает опцию -L 1 что означает только процесс 1 файл за один раз так или иначе, таким образом, можно также непосредственно использовать find с -exec.

2
26.11.2013, 12:21
2 ответа

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

 $ readelf -a core
 ELF Header:
 Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
 Class:                             ELF32
 Data:                              2's complement, little endian
 Version:                           1 (current)
 OS/ABI:                            UNIX - System V
 ABI Version:                       0
 Type:                              CORE (Core file)
 Machine:                           Intel 80386
 [...]

Платформа определенное количество "примечаний" добавляется к сегменту NOTES так, чтобы отладчик мог найти свой путь вокруг, например, для Соляриса, видит ядро (4), и Вы отметите NT_UTSNAME структура, которая содержит структуру данных от uname(2) syscall. elfdump -n путь состоит в том, чтобы считать, что, но насколько я знаю, Солярисом является единственная ОС, которая делает это (и я подозреваю только Солярис 11 elfdump работы, как надеялся).

Простое, хотя немного трудный и не - гарантируемый путь должен попытаться ловить рыбу HOST или HOSTNAME переменные (установленный некоторыми сценариями запуска и оболочками, bash по крайней мере, наборы HOSTNAME) из среды дампа ядра. Можно сделать это с gdb, хотя Вам нужен исходный двоичный файл:

$ gdb /usr/bin/sleep core
[... snip ...]
(gdb) print (char ***) &environ
$1 = (char ***) 0x600bf8
(gdb) print $1[0][0]@10
$2 = {0x7fffffffd9c9 "HOST=myhostname", 0x7fffffffd9d9 "TERM=screen", 
0x7fffffffd9e5 "SHELL=/bin/csh", 
[...]

Это печатает блок строк от environ символ. Хотя это - ужасный взлом strings | grep HOSTNAME= просто мог бы работать также.

Так, короткий ответ на "Является там способом узнать, какой хост генерировал тот базовый файл": не легко, и не надежно на Linux.

FWIW, соответствующий код coredump Linux находится в fs/binfmt_elf.c, и существует рычаг для разрешения дополнительных "примечаний" посредством ARCH_HAVE_EXTRA_ELF_NOTES, в настоящее время только используемый на PowerPC.)

Лучший план в целом состоит в том, чтобы использовать sysctl для установки базового имени файла на каждом клиенте, как предложено @jlliagre:

sysctl kernel.core_pattern="%h-%t-%e.core"

(sysctl и рыться вокруг в /proc эквивалентны здесь, я предпочитаю sysctl так как изменения могут быть сохранены зарегистрированными в /etc/sysctl.conf и это используется на *системы BSD также.)

5
27.01.2020, 21:50
  • 1
    strings | grep HOSTNAME= то, что я начал использовать. Это - интерактивное использование; таким образом, хорошо, если это приводит часть к сбою времени. –  luispedro 28.11.2013, 16:24

Вы могли бы работать strings core.1234 и найдите, появляется ли имя хоста где-нибудь. Некоторые Ose как Солярис действительно помещают имя хоста в базовый заголовок, но насколько я знаю, Linux не делает этого так strings метод был бы ненадежен с ним.

Лучший подход должен был бы настроить NFS клиенты для помещения их имен хостов в базовые имена файлов путем установки /proc/sys/kernel/core_pattern файл или некоторое распределение определенная конфигурация, если core_pattern обратитесь к исполняемому файлу.

5
27.01.2020, 21:50

Теги

Похожие вопросы