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.