Как изменить шаблон ядра только для определенного приложения?

Мое приложение требует, чтобы основной файл был сгенерирован по определенному шаблону.

Как это сделать, не затрагивая другие процессы?

И как мне это сделать, когда /proc доступен только для чтения?


person Thirupathi Thangavel    schedule 04.06.2015    source источник
comment
Что означает генерировать основной файл по определенному шаблону?   -  person sehe    schedule 04.06.2015
comment
Я хочу, чтобы основной файл был сгенерирован с именем файла в заданном формате (который содержит PID процесса и т. д.). Это можно сделать, установив шаблон в /proc/sys/kernel/core_pattern. используя спецификаторы, такие как %p, %e. Но этот метод повлияет на шаблон основного файла глобально. Я не хочу, чтобы это произошло. Мне не разрешено изменять основной шаблон других процессов и чужих процессов.   -  person Thirupathi Thangavel    schedule 08.06.2015


Ответы (1)


man core говорит нам:

Передача дампов ядра в программу

Начиная с ядра 2.6.19, Linux поддерживает альтернативный синтаксис для файла /proc/sys/kernel/core_pattern. Если первым символом этого файла является символ вертикальной черты (|), то оставшаяся часть строки интерпретируется как программа, которую нужно выполнить. Вместо записи в файл на диске дамп памяти предоставляется программе в качестве стандартного ввода.

Обратите внимание на следующие моменты:

  • Программа должна быть указана с использованием абсолютного пути (или пути относительно корневого каталога, /) и должна сразу следовать за символом '|' персонаж.

  • Процесс, созданный для запуска программы, запускается от имени пользователя и группы root.

  • Аргументы командной строки могут быть переданы программе (начиная с Linux 2.6.24), разделенные пробелом (до общей длины строки 128 байт).

  • Аргументы командной строки могут включать любой из спецификаторов %, перечисленных выше. Например, чтобы передать PID процесса, для которого создается дамп, укажите %p в качестве аргумента.

Вы можете поместить туда скрипт, например, например.

| /path/to/myscript %p %s %c

Вы можете определить, какой процесс запускает дамп ядра: (man core):

       %%  a single % character
       %p  PID of dumped process
       %u  (numeric) real UID of dumped process
       %g  (numeric) real GID of dumped process
       %s  number of signal causing dump
       %t  time of dump, expressed as seconds since the Epoch,  1970-01-01
           00:00:00 +0000 (UTC)
       %h  hostname (same as nodename returned by uname(2))
       %e  executable filename (without path prefix)
       %E  pathname of executable, with slashes ('/') replaced by exclama‐
           tion marks ('!').
       %c  core file size soft resource limit of crashing  process  (since
           Linux 2.6.24)

Теперь все, что вам нужно сделать, это «сделать что-то по умолчанию» для процессов, отличных от ваших собственных.

person sehe    schedule 04.06.2015
comment
@t_thirupathi хорошо. Я хочу сказать, что вы можете создать скрипт, который делает все по умолчанию, за исключением ваших собственных программ. Не лгите - поблагодарите меня, если вы не поняли ответ. - person sehe; 08.06.2015
comment
Прошу прощения за недоразумение. Мне нравится ответ. Собираюсь попробовать. Однако у меня есть несколько вопросов. 1. Будет ли это применимо к дочерним процессам и потокам (LWP), созданным приложением? 2. Есть ли ярлык для отображения нескольких приложений с одним и тем же базовым шаблоном? 3. Обязательно ли запускать процесс с правами root? Мой процесс должен быть запущен от имени другого пользователя. Спасибо. - person Thirupathi Thangavel; 08.06.2015
comment
1. Вы можете реализовать практически любую логику, которую пожелаете, в своем сценарии (например, используйте ps для поиска родительского процесса/группы процессов). 2. То же самое для списка приложений (простой сценарий bash будет использовать case...esac с шаблонами глобусов) 3. Нет. Сценарий (очевидно) будет запускаться с правами root. Вы можете отказаться от привилегий (например, sudo -u otheruser) - person sehe; 08.06.2015