Я прочитал man core и man date, а также четыре качественные веб-страницы, посвященные дампам ядра. Я изучаю и практикуюсь в создании дампов ядра уже четыре дня.
Вопрос хорошо сформулирован в заголовке поста.
Примечание: когда я говорю о «ядре», я также имею в виду параметр ядра kernel.core_pattern и буду называть его переменной среды. Я называю это переменной среды, потому что она действует как переменная среды в глобальной области видимости. Я использую эти термины взаимозаменяемо.
ядро описывает на странице руководства, как установить эту переменную среды в
соответствовать шаблону. Шаблон предлагает «спецификатор времени» %t
что обеспечивает
в шаблон текущее время в формате unix, секунды с начала эпохи.
В соответствии с основными рекомендациями следующий сценарий является применимым шаблоном:
ядро.%e.%t
%e - имя исполняемого файла
%t — время дампа, выраженное в секундах с начала Эпохи.
core - это имя файла. Это может быть ядро или любое имя, которое вы ему дадите.
Примечание: может быть путь, ведущий туда, куда вы хотите поместить файл; но я буду писать в текущий рабочий каталог; и я сделаю чтение сценария здесь простым, поэтому я опускаю путь.
Мы можем установить переменную среды следующим образом:
sudo sysctl -w kernel.core_pattern=core.%e.%t
Теперь мне нужна дата в двузначном формате года, двухзначного месяца, двузначного дня, например 220224.Проблема в указателе времени %t
ядра предоставляет время в секундах с начала эпохи, не очень удобно для человека!
Я также потребовал, чтобы дата стала самой последней датой после выполнения скрипта. Спецификатор времени %t
ядра сделает это; но,
в результате имя файла читается с отметкой времени unix, что не очень удобно для человека!
И наоборот, если я заменю скрипт на место указателя времени ядра при установке переменной окружения kernel.core_pattern, тогда шаблон именования ядра всегда будет записываться с датой, указанной во время создания шаблона, а не с фактическим временем ядра. свалка.
Сценарий, который я придумал для этого, следующий. Я просто заменил основной спецификатор времени в шаблоне приведенным здесь фрагментом:
дата -d "-8 часов" +%y%m%d
Но помните, если я использую сценарий вместо спецификатора времени ядра, время, установленное в шаблоне, становится жестко запрограммированным и не будет точным в следующий раз, когда мне нужно будет извлечь дамп ядра.
Мои скрипты выглядят так:
sudo sysctl -w kernel.core_pattern=core.%e.`date -d "-8 часов" +%y%m%d`; ~/test.out
~/test.out
часть этого сценария запускает тестовый файл, который я использую, чтобы узнать, как устранять неполадки при установке Linux.
Мой сценарий устанавливает переменную среды прямо перед вызовом сценария тестирования. Преимущество этого в том, что файл дампа ядра получает имя так же, как вызывается сценарий тестирования; и это дает файлу дампа ядра осмысленное имя.
Мой сценарий работает; тем не менее, каждый раз, когда мне нужно получить дамп ядра, я должен помнить, что вызов сценария тестирования должен сопровождаться моим сценарием. Если я не комбинирую назначение переменной среды с вызовом сценария тестирования, дата, записанная в файл дампа ядра, становится такой, какой она была установлена в последний раз, когда было установлено назначение переменной среды, не очень точно.
Я хочу переписать свой сценарий, чтобы максимально использовать дату, записанную в удобочитаемом формате, а также дату, записанную во время создания дампа ядра. Я пытался!
Одна проблема, с которой я столкнулся, возникает из-за того, что команда date использует тот же токен управления форматом. %t
как и токен спецификатора основного шаблона %t
Это тест для подтверждения конфликта основного спецификатора времени и управления форматом команды даты:
этот токен должен быть из основного спецификатора времени
sudo sysctl -w kernel.core_pattern=core.%e.`date -d@%t +%y%m%d`; ~/test.out
Это дает сообщение «дата: неверная дата â@%tâ»
Видите ли, мы не можем просто вставить основной спецификатор времени в местонахождение времени скрипта даты.
Это тест для подтверждения того, что скрипт работает по назначению:
Это временная метка эпохи Unix.
sudo sysctl -w kernel.core_pattern=core.%e.`date -d@1645337785 +%y%m%d`; ~/test.out
Это работает, как и ожидалось, за исключением того, что дата остается постоянной.
Видите ли вы, что временная отметка unix может фактически оказаться вместо временного местоположения сценария даты.
Там может быть другой способ сделать это; но я не знаю. Я спрашиваю, видит ли кто-нибудь из вас способ обойти это.
Спасибо за ваше время заранее.