Am citit paginile man de bază și man date și patru pagini web de calitate pe teme de bază. De patru zile studiez și exersez să fac depozite de miez.
Întrebarea este bine formulată în titlul acestei postări.
Notă: când mă refer la „core”, mă refer și la parametrul kernelului kernel.core_pattern și îl voi numi o variabilă de mediu. O numesc variabilă de mediu, deoarece acționează ca o variabilă de mediu în domeniul global. Folosesc acești termeni în mod interschimbabil.
core descrie în pagina de manual cum să setați această variabilă de mediu la
potriviți un șablon. Șablonul oferă un „specificator de timp” %t
care prevede
la șablon ora curentă în format unix, secunde de la epocă.
Conform regulilor de bază, acest script este un șablon aplicabil:
miez.%e.%t
%e este numele fișierului executabil
%t este timpul de descărcare, exprimat în secunde de la Epocă
core este numele fișierului. Ar putea fi de bază sau orice nume pe care i-o dai.
Notă: ar putea exista o cale care duce la locul în care doriți să fie plasat fișierul; dar, voi scrie în directorul de lucru curent; și, voi face citirea scenariului de aici simplă, așa că omit calea.
Putem seta variabila de mediu astfel:
sudo sysctl -w kernel.core_pattern=core.%e.%t
Acum, am nevoie de data în format de două cifre, an, două cifre, lună, două cifre, zi, cum ar fi 220224.Problema este specificatorul de timp %t
de nucleu oferă timp în secunde de la epoca, nu foarte prietenos uman!
Am cerut, de asemenea, ca data să devină cea mai actuală dată la executarea scriptului. Specificatorul de timp %t
de nucleu va face acest lucru; dar,
rezultatul este că numele fișierului se citește cu un marcaj de timp Unix, nu foarte prietenos cu oamenii!
În schimb, dacă înlocuiesc un script în locația specificatorului de timp al core-ului în timp ce setez variabila de mediu kernel.core_pattern, atunci șablonul de denumire al core-ului va fi întotdeauna scris cu data înscrisă la momentul în care șablonul a fost creat și nu cu ora reală a core-ului. haldă.
Scriptul pe care l-am conceput pentru a face acest lucru este următorul. Tocmai am înlocuit specificatorul de timp de bază din șablon cu fragmentul furnizat aici:
data -d „-8 ore” +%y%m%d
Dar amintiți-vă, dacă folosesc un script în locul indicatorului de timp al core-ului, timpul stabilit în șablon devine greu codificat și nu va fi precis data viitoare când trebuie să trag un core-dump.
Scripturile mele arată astfel:
sudo sysctl -w kernel.core_pattern=core.%e.`date -d "-8 ore" +%y%m%d`; ~/test.out
The ~/test.out
o parte din acel script rulează un fișier de testare pe care îl folosesc pentru a afla cum să depanez instalările Linux.
Scriptul meu setează variabila de mediu chiar înainte de a apela scriptul de testare. Avantajul acestui lucru este că fișierul core-dump este numit așa cum este numit scriptul de testare; și, acest lucru dă fișierului core-dump un nume semnificativ.
Scenariul meu funcționează; totuși, de fiecare dată când trebuie să fac un core-dump, trebuie să-mi amintesc să însoțesc apelul la scriptul de testare cu scriptul meu. Dacă nu combin atribuirea la variabila de mediu cu apelul la scriptul de testare, data scrisă în fișierul de descărcare de bază devine orice a fost setată la ultima dată când a fost setată atribuirea variabilei de mediu, nu foarte precisă.
Vreau să-mi rescriu scriptul pentru a obține cel mai bun lucru de a avea data scrisă într-un format care poate fi citit de om, precum și data scrisă la momentul în care a avut loc descărcarea de bază. Am încercat!
O problemă pe care am întâlnit-o apare deoarece comanda date folosește același simbol de control al formatului %t
la fel ca și jetonul de specificare a șablonului de bază %t
Acesta este un test pentru a confirma conflictul dintre specificatorul de timp de bază și controlul de format al comenzii date:
acest token este menit să fie de la specificatorul de timp de bază
sudo sysctl -w kernel.core_pattern=core.%e.`date -d@%t +%y%m%d`; ~/test.out
Acest lucru dă un mesaj „data: dată nevalidă â@%tâ”.
Vedeți că nu putem introduce pur și simplu specificatorul de timp de bază în locația de timp a scriptului de dată.
Acesta este un test pentru a confirma că scriptul funcționează atunci când este utilizat conform intenției:
Acesta este un marcaj temporal de epocă Unix
sudo sysctl -w kernel.core_pattern=core.%e.`date -d@1645337785 +%y%m%d`; ~/test.out
Acest lucru funcționează conform așteptărilor, cu excepția faptului că data rămâne constantă.
Vedeți că ștampila de timp Unix poate să cadă în locul locației de timp a scriptului de dată?
Poate există o altă modalitate de a face asta; dar nu știu. Vă întreb dacă vreunul dintre voi vede o cale de a evita asta.
Vă mulțumim anticipat pentru timpul acordat.