Under Construction
utmp-Einträge von init(1)
Der Prozeß init(1) ist der erste nach dem Booten gestartete Prozeß. Er erzeugt utmp-Einträge in /etc/utmp und /var/adm/wtmp. Direkt nach dem Start generiert init(1) einen Eintrag mit Typ 2 (BOOT_TIME) und hält den Zeitpunkt des Boots fest. Die Zeichenkette „system boot“ wird dazu in dem Feld ut_line abgespeichert und die aktuell Zeit wird im Feld ut_time festgehalten:
# /usr/sbin/acct/fwtmp </etc/utmp | grep " 2 "
system boot 2 0 0000 0000 1641915478 Tue Jan 11 16:37:58 2022
#
Dieser Eintrag wird von who(1) angezeigt, wenn das Kommando mit der Option ‘-b’ (Zeitpunkt letzter Boot) gestartet wird:
$ who -b
. system boot Jan 11 16:37
$
Als nächstes hält init(1) den Run-Level fest, in den gebootet werden soll. Dazu wird ein Eintrag vom Typ 1 (RUN_LVL) mit der Zeichenkette „run-level N“ (wobei N der Run-Level ist, in der Regel 2) im Feld ut_line erzeugt:
# /usr/sbin/acct/fwtmp </etc/utmp | grep " 1 "
run-level 2 1 0 0062 0123 1641915478 Tue Jan 11 16:37:58 2022
#
Der Eintrag wird von der Option ‘-r’ (Run-Level) des who-Kommandos verwendet:
$ who -r
. run-level 2 Jan 11 16:37 2 0 S
$
Beide Einträge werden in /etc/utmp und /var/adm/wtmp abgespeichert.
Als nächstes wird, für jeden Eintrag aus der /etc/inittab der gestartet wird, ein Eintrag vom Typ 5 (INIT_PROCESS) generiert. Dieser wird wieder sowohl in /etc/utmp, als auch /var/adm/wtmp, festgehalten:
# /usr/sbin/acct/fwtmp </etc/utmp | grep " 5 "
srcmstr srcmstr 5 4522192 0000 0000 1641915480 Tue Jan 11 16:38:00 2022
cron cron 5 6226138 0000 0000 1641915499 Tue Jan 11 16:38:19 2022
#
Bei jedem dieser Einträge sind die beiden Felder ut_user und ut_id mit der ID des inittab-Eintrags belegt. Neben der Start-Zeit wird noch die PID des gestarteten Prozesses abgespeichert. Das Kommando who(1) zeigt diese Einträge mit der Option ‚-p‘ an:
$ who -p
srcmstr . Jan 11 16:38 0:13 4522192 id=srcmstr
cron . Jan 11 16:38 0:13 6226138 id=cron
$
Wird ein solcher von init(1) gestarteter Prozeß beendet, wird ein Eintrag vom Typ 8 (DEAD_PROCESS) generiert. Das Feld ut_user bleibt leer und die ID des zugehörigen inittab-Eintrags wird in ut_id eingetragen. Als Zeitstempel (ut_time) wird der Zeitpunkt der Beendigung des Prozesses eingetragen:
# /usr/sbin/acct/fwtmp </etc/utmp | grep " 8 "
securityboot 8 4718738 0000 0000 1641915478 Tue Jan 11 16:37:58 2022
mlsboot 8 4718740 0000 0000 1641915478 Tue Jan 11 16:37:58 2022
tunables 8 4718742 0000 0000 1641915479 Tue Jan 11 16:37:59 2022
rc 8 4784308 0000 0000 1641915480 Tue Jan 11 16:38:00 2022
…
#
Beim Loggen des Eintrags unterscheidet sich das Vorgehen bei /etc/utmp und /var/adm/wtmp. Während beim Loggen nach /var/adm/wtmp der Eintrag einfach am Ende hinzugefügt wird, wird im Falle von /etc/utmp der zugehörige Eintrag vom Typ 5 (INIT_PROCESS) überschrieben. D.h. das es in /etc/utmp niemals 2 Einträge für einen von init(1) gestarteten Prozeß gibt. Solange der Prozeß noch läuft gibt es einen Typ 5 Eintrag, wenn der Prozeß dann beendet ist, gibt es einen Typ 8 Eintrag! In /var/adm/wtmp findet man beide Einträge, den Typ 5 Eintrag vom Starten des Prozesses und den Typ 8 Eintrag von der Beendigung des Prozesses.
Das Kommando who(1) bietet für die Anzeige der Typ 8 (DEAD_PROCESS) Einträge die Option ‚-d‘:
# who -d
. . Jan 11 16:37 0:12 4718738 id=securit term=0 exit=0
. . Jan 11 16:37 0:12 4718740 id=mlsboot term=0 exit=0
. . Jan 11 16:37 0:12 4718742 id=tunable term=0 exit=0
. . Jan 11 16:38 0:12 4784308 id=rc term=0 exit=0
…
#
Für beendete Prozesse (Typ 8 Einträge) wird auch der Exit-Code des Prozesses im Feld ut_exit.e_exit festgehalten. Sollte der Prozeß durch ein Signal (z.B. kill-Kommando) beendet worden sein, wird die Signal-Nummer im Feld ut_exit.e_termination festgehalten.
# /usr/sbin/acct/fwtmp </etc/utmp
…
clusterconf 8 8192004 0000 0021 1641915536 Tue Jan 11 16:38:56 2022
…
test 8 6488164 0011 0000 1642003287 Wed Jan 12 17:01:27 2022
…
#
Der Eintrag clusterconf aus /etc/inittab wurde mit Exit-Status oktal 0021 (dezimal 17) beendet. Der durch den Eintrag mit ID test gestartete Prozeß wurde mit dem Signal oktal 0011 (dezimal 9=KILL) beendet. Das Kommando „who –d“ zeigt diese Informationen als „term=X“ und „exit=X“ an:
$ who –d
…
. . Jan 11 16:38 . 8192004 id=cluster term=0 exit=17
…
. . Jan 12 17:01 . 6488164 id=test term=9 exit=0
…
$
Bei Einträgen, die durch respawn immer wieder gestartet werden, wird in /etc/utmp der entsprechende Eintrag immer wieder überschrieben. D.h. man wird dort in der Regel für mit respawn gestartete Einträge keinen Typ 8 (DEAD_PROCESS) Eintrag sehen, da dieser durch das Respawn sofort durch einen Typ 5 (INIT_PROCESS) Eintrag ersetzt wird. In /var/adm/wtmp hingegen, findet man immer die komplette Historie, da hier keine Einträge überschrieben werden, sondern immer angefügt wird.