2017-07-24 1 views
1

Ich arbeite an einem Bash-Skript, das verschiedene diagnostische Informationen auf einem CentOS-Server sammelt und verpackt, so dass sie an unser Unternehmen zur Analyse gesendet werden können. Als Teil dieses Skripts überprüfe ich, ob die Anwendung des Unternehmens reaktionsfähig ist. Wenn dies nicht der Fall, löse ich einen Core-Dump des Bewerbungsverfahrens:Finden Sie heraus, wenn Core-Dump abgeschlossen ist

kill -6 $app_pid 

Dieser Befehl ein Prozess Core Dump verursachen wird für die pid $app_pid geschrieben werden. Ich muss jedoch warten, bis die Core-Dump-Generierung abgeschlossen ist. Andernfalls kann ich beschädigte Diagnosepakete aufgrund des unvollständigen Core-Dumps erstellen.

Ich hoffe, diese Prüfung mit den Standard-Centos-Pakete zu tun, aber bin auch offen für die Installation zusätzlicher Pakete, wenn ich muss.

+0

Ich bin mir nicht sicher, dass dies eine StackOverflow-Frage mehr als eine Frage [Unix.se] oder [SuperUser] (https://superuser.com/) ist. Es geht darum, eine Bestimmung zu treffen, die sicherlich beim Schreiben von Code relevant sein kann, aber keineswegs nur in dieser Situation relevant ist - ein Systemadministrator, der versucht, eine manuelle Entscheidung zu treffen, könnte die gleiche Frage haben. –

+0

BTW - welche Version von CentOS, genau? Wenn Sie systemd-basiert sind, steht Ihnen 'systemd-coredump' zur Verfügung. –

+0

Wir verwenden immer noch CentOS 6 für unsere Anwendungsserver. – Andrew

Antwort

0

Ich konnte mein Skript warten, bis der Core-Dump-Schreibvorgang mit inotifywait beendet wurde. Siehe folgendes Codefragment:

core_file="core.$app_pid" 
core_path=/path/core/file/dir 
core_complete="false" 
# Setup inotifywait loop to wait until core file has been complety written 
inotifywait -e close_write --format '%f' $core_path | while read line; do 
    echo "File $line was closed" 
    # Check to see if the line we read was the core file 
    if [[ "$line" == "$core_file" ]]; then 
    echo "Core file write complete" 
    core_complete="true" 
    fi 
done 

Dies scheint bisher der Trick zu sein.

1

Der Mechanismus, der Ihnen die meiste Kontrolle gibt, ist die Angabe einer Pipeline in /proc/sys/kernel/core_pattern. Dadurch kann ein Programm Ihrer Wahl ausgeführt werden, wenn ein Arbeitsspeicherabzug erstellt wird, so dass das Programm 100% sicher sein kann, dass es den vollständigen Speicherauszug hat, wenn (und nur wenn!) Sein stdin-Dateideskriptor in der EOF-Bedingung ist. Siehe Abschnitt "Piping-Core-Dumps an ein Programm" in man 5 core.

Wenn Sie systemd verwenden (wie es moderne Versionen von CentOS tun), konfiguriert sich das Programm systemd-coredump bereits selbst auf diese Weise. systemd-coredump benennt Dateien nach Abschluss der Komprimierung von einem temporären Namen um, sodass sichergestellt wird, dass nur ein vollständiger Arbeitsspeicher zur Protokollierung bereitsteht.

Wenn Sie also eine Datei des Formulars benannt haben:

/var/lib/systemd/coredump/core.*.lz4 

(oder auf andere Weise mit der Erweiterung des gewählten Kompressionsalgorithmus) können Sie bereits sicher sein, dass es vollständig, wie die Datei geschrieben wurde und hatte seine Berechtigungen vor es wurde in diesen endgültigen Namen umbenannt.


Wenn Sie nicht systemd verwenden und nicht möchten, dass Ihre eigenen Prozess implementieren, um die Pipeline-Schnittstelle zu handhaben, dann ist es der allgemeine Ansatz: fuser verwendet werden kann, um zu bestimmen, ob irgendwelche Prozesse eine haben Öffnen Sie den Handle für eine Datei. Also:

fuser -f core 

... wird Ausgabe nur emittieren, wenn ein Kernspeicherauszug durch einen laufenden Prozess geöffnet ist.

Verwandte Themen