Wann wird ein cron-Job das nächste Mal gestartet

Der Dienst cron wird auf vielen Unix-Systemen ausgiebig verwendet. Die Möglichkeiten anzugeben, wann ein Kommando mittels cron gestartet werden soll, sind vielfältig. Hier erst mal einige Beispiel-Zeilen aus einer möglichen crontab eines Benutzers:

5 0 * * * /usr/local/bin/daily.job
15 14 1 * * /usr/local/bin/monthly.job
0 22 * * 1-5 /usr/local/bin/weekdays.job

Die Korn-Shell 93 (auf vielen Systemen als ksh93 verfügbar) bietet eine einfache Möglichkeit den nächsten Start eines cron-Jobs anzeigen zu lassen, und zwar mittels der eingebauten Funktion printf und der Format Angabe %T für Datumsausgaben:

ksh93 $ printf "%T\n" "5 0 * * *"
Fr 19 Jan 00:05:00 2018

Man verwendet als erstes Argument im Format-String das %T für Datum und gibt im entsprechenden Argument (hier das zweite) die Intervall-Angabe aus dem crontab-Eintrag an. Das Resultat ist in diesem Fall der Zeitpunkt wann der Job daily.job aus dem Beispiel oben das nächste Mal gestartet wird.

Hier ein Beispiel für den zweiten Job monthly.job:

ksh93 $ printf "monthly.job: %T\n" "15 14 1 * *"
monthly.job: Do 1 Feb 14:15:00 2018

Arbeitet man nicht in der ksh93 selbst, dann kann man die folgende Variante nutzen:

bash $ ksh93 -c 'printf "%T\n" "0 22 * * 1-5"'
Do 18 Jan 22:00:00 2018

Hinweis: Auf einigen Systemen ist die Korn-Shell 93 als ksh verfügbar. Das kann man mit dem folgenden Kommando überprüfen:

$ ksh
$ print ${.sh.version}
Version AJM 93u+ 2012-08-01

Im AIX-Talk crontab & cron wird die Datumsausgabe für crontab-Einträge demonstriert.

Mounten eines ISO-Images

Natürlich lässt sich mit dem im letzten Beitrag vorgestellten Kommando /usr/sbin/loopmount auch ein ISO-Image mounten:

# loopmount -i /path/to/iso/image.iso -o „-o ro -V cdrfs“ -m /mnt

Unmounten und löschen des erzeugten loopback Devices geht dann mit /usr/sbin/loopumount:

# loopumount -l loopX -m /mnt

 

Erzeugen eines jfs2-Filesystems in einer Datei

Gelegentlich gibt es Situationen, in denen man ein Filesystem braucht, man aber nicht die Möglichkeit hat ein Filesystem in einem Logical Volume zu verwenden. Eine Möglichkeit dann doch zu einem Filesystem zu kommen, besteht darin das Filesystem in einer Datei anzulegen. Dies soll in diesem Beitrag beschrieben werden.

Zunächst muss man eine Datei anlegen, in welcher das jfs2-Filesystem angelegt werden soll. Diese könnte auch in einem per NFS gemounteten Filesystem liegen:

# lmktemp /path/to/file 1000m

Hier kann man leider nicht g für GB angeben. Die Datei kann natürlich auch mit anderen Kommandos (z.B. dd) erzeugt werden. Für diese Datei muss nun ein Gerät erzeugen werden, mittels dem man auf die Datei zugreifen kann. Der Geräte-Typ der dies erlaubt, sind die loopback Devices. Standardmäßig werden diese Geräte mit loop und einer fortlaufenden Nummer benannt. Mittels lsdev kann leicht überprüft werden, ob man schon ein solches Device hat:

# lsdev -l loop\*

Mit dem Kommando /usr/sbin/loopmount kann man ein solches Gerät erzeugen:

# loopmount -i /path/to/file

Jetzt sollte es ein neues loopback Device geben:

# lsdev -l loop\*
loop0 Available  Loopback Device

# lsattr -El loop0
filename  /tmp/bigfile Name of the image file to be associated with the device True
temporary yes          Determines if the device should be removed at boot time True

Nun kann auf dem loopback Device ein jfs2-Filesystem erzeugt werden:

# mkfs -V jfs2 -o log=INLINE /dev/loop0
mkfs: destroy /dev/loop0 (y)? y
logform: Format inline log for  <y>?y
File system created successfully.
1015572 kilobytes total disk space.
Device /dev/loop0:
Standard empty file system
Size:           2031144 512-byte (DEVBLKSIZE) blocks

Das erzeugte Filesystem kann nun gemountet werden. Wenn die Datei schon ein jfs2-Filesystem beinhaltet, dann darf natürlich das Kommando mkfs nicht noch einmal ausgeführt werden.

# loopmount -l loop0 -o „-V jfs2 -o log=INLINE“ -m /mnt

Alternativ kann das Filesystem auch mit dem Kommando mount gemountet werden:

# mount -V jfs2 -o log=INLINE /dev/loop0 /mnt

Das Filesystem kann nun ganz normal benutzt werden.

# df -g /mnt
Filesystem    GB blocks      Free %Used    Iused %Iused Mounted on
/dev/loop0         0.98      0.97    1%        4     1% /mnt

Wird das Filesystem nicht mehr benötigt, dann kann es ganz einfach wieder entfernt werden:

# loopumount -l loop0 -m /mnt

Das Filesystem wird ausgehangen und das loopback Device wird gelöscht (falls das Attribut temporary auf yes gesetzt ist, das ist der Default für loopback Devices).

Die Datei muss aber manuell gelöscht werden, wenn diese nicht mehr benötigt wird:

# rm /path/to/file