Category Archives: Ubuntu/Debian

Linux – Swap testen

Die Bereitstellung eines ausreichend großen Swapspace zur Erweiterung des verfügbaren Arbeitsspeichers war früher eine zwingende Notwendigkeit – RAM war stets knapp und teuer. Bei den heutigen Mengen an RAM ist das Thema Swap sicherlich nicht mehr von so großer Bedeutung wie früher (manche verzichten mittlerweile sogar ganz darauf) – doch gibt es immer noch gute Gründe dafür, einen Bereich der Festplatte hierfür vorzusehen, je nach Anwendungsfall in der Größenordnung des 1- bis 3-fachen des verbauten RAMs.

Unter Linux kommt hierzu meistens eine Swap-Partition zum Einsatz, welche über die /etc/fstab eingebunden wird. Mittels free -m lässt sich die aktuelle Belegung des Arbeitsspeichers einschließlich Swap überprüfen.

Um die ordnungsgemäße Funktion und Nutzung der Swap-Partition zu testen, sprich als Härtetest den „Ernstfall“ zu proben, kann folgendes C-Programm verwendet werden (Nutzung auf eigene Gefahr!):

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv) {
  int max = -1;
  int mb = 0;
  char* buffer;

  if(argc > 1)
    max = atoi(argv[1]);

   while((buffer=malloc(1024*1024)) != NULL && mb != max) {
    memset(buffer, 0, 1024*1024);
    mb++;
    printf("Allocated %d MB\n", mb);
   }

   return 0;
}

Das Script unter memeater.c speichern und mittels gcc memeater.c -o memeater kompilieren.

Achtung! Ich weise erneut darauf hin, das die Nutzung dieses Programms ausdrücklich auf eigene Gefahr erfolgt. Bevor man dieses Programm startet, sollten alle nicht gespeicherten Daten gesichert und alle geöffneten Programme geschlossen werden.

Was macht dieses Programm? Es belegt soviel Arbeitsspeicher, wie es nur kann – entweder einen per Parameter festgelegten Wert oder den gesamten verfügbaren Arbeitsspeicher (Aufruf ohne Parameter). Das Programm sollte bei Erreichen des Maximalwerts abbrechen, um einen Speicherüberlauf (Out-of-Memory) zu verhindern – denn dieser ist bekanntermaßen alles andere als spaßig.

Der Aufruf erfolgt mittels ./memeater parameter. Als Parameter kann auch ein fester Wert in MB eingegeben werden. Um beispielsweise 900 MB zu belegen, erfolgt der Aufruf mittels ./memeater 900

Nach erfolgreichem Start sollte nachfolgende Ausgabe in ähnlicher Form erscheinen:

$ ./memeater
Allocated 1 MB
Allocated 2 MB
(...)
Allocated 16381 MB
Allocated 16382 MB
Allocated 16383 MB
Killed

Lässt man parallel einen Systemmonitor mitlaufen, kann man die Belegung des Arbeitsspeichers auch grafisch mitverfolgen. Kommt das Programm an die Grenze des zur Verfügung stehenden Speichers, kann das System kurzzeitig zum Stillstand kommen, bis der Prozess beendet wurde.

Überprüft man unmittelbar im Anschluss die Speicherbelegung mittels free -m, lässt sich ersehen, ob und inwieweit der Swapspace genutzt wird.

Scannen/Kopieren per Shell-Script

Scannen stellt unter Linux kein großes Problem mehr dar – viele Scanner werden von der Sane-API unterstützt und lassen sich mittels diverser Frontends komfortabel nutzen.

Oftmals ist die Nutzung eines grafischen Frontends allerdings gar nicht erforderlich – gerade wenn um reine Archivierungszwecke oder einfache Kopien vollständiger A4-Seiten geht. Anstelle im grafischen Frontend zig Knöpfe zu drücken, um einen Scan als PDF-Datei abzulegen, lässt sich das Ganze per Shellscript und scanimage automatisieren. Dieses Script lässt sich auch als Starter mit der enthaltenen Befehlszeile gnome-terminal -x sh -c "/home/user/scripts/scan-a4-color-300dpi.sh" auf den Desktop legen und bequem starten.

Scannen und als PDF ablegen

Das nachfolgende Script erzeugt eine PDF-Datei in Farbe. Hierzu wird die A4-Vorlage mit 300 DPI in Farbe eingescannt, das resultierende Image optimiert, in das JPEG-Format umgewandelt und als PDF-Datei, benannt nach Datum und Uhrzeit, abgelegt. Anschließend wird diese im Dokumentbetrachter evince geöffnet.

#!/bin/bash
# Setzen der Variablen (Datum, Uhrzeit)
zeitstempel=$(date +%Y-%m-%d_%H-%M-%S)

# Scanvorgang, Ausgabeformat TIFF
scanimage \
--clear-calibration \
--format=tiff \
--mode Color \
--depth 8 \
--resolution 300 \
--icc-profile /usr/share/color/icc/adobergb1998.icc \
-l 1mm \
-t 1mm \
-x 208mm \
-y 295mm \
-p \
-v \
> /home/user/Scans-Neu/tmp/"$zeitstempel".tif

# Konvertieren des TIFF-Bildes in JPEG incl. Bildverbesserung
convert \
-quality 95 \
-gamma 1.0 \
-brightness-contrast 10x40 \
/home/user/Scans-Neu/tmp/"$zeitstempel".tif \
/home/user/Scans-Neu/tmp/"$zeitstempel".jpg

# Konvertierung ins PDF-Format
convert /home/user/Scans-Neu/tmp/"$zeitstempel".jpg /home/user/Scans-Neu/"$zeitstempel".pdf

# Entfernen der temporaeren Dateien
rm /home/user/Scans-Neu/tmp/"$zeitstempel".tif
rm /home/user/Scans-Neu/tmp/"$zeitstempel".jpg

# Anzeigen des fertigen PDF-Dokuments
evince /home/user/Scans-Neu/"$zeitstempel".pdf

Das Script lässt sich in vielen Punkten individualisieren, z.B. hinsichtlich der Farbtiefe. Reine Textvorlagen lassen sich z.B. im „Lineart“-Modus (1-Bit) scannen und mittels tiff2pdf mit geringem Speicherbedarf als PDF ablegen. Denkbar ist beispielsweise auch eine integrierte Texterkennung mittels OCR, um ein durchsuchbares Dokument zu erzeugen. Für meinen Anwendungsfall reichte das einfache Einbetten eines JPEG-Image in einem PDF allerdings aus.

Eine Abwandlung des obigen Scripts verwandelt den Scanner in einen Farbkopierer:

Scannen und ausdrucken (Kopieren)

Das folgende Script ist eine Abwandlung des obigen „Scan2PDF“-Scripts. Die A4-Vorlage wird mit 300 DPI eingescannt, das resultierende Image optimiert, mittels tiff2ps für den Druck aufbereitet und über eine Pipe an den Drucker gesendet:

#!/bin/bash
# Setzen der Variablen (Datum, Uhrzeit)
zeitstempel=$(date +%Y-%m-%d_%H-%M-%S)

# Scanvorgang, Ausgabeformat TIFF
scanimage \
--clear-calibration \
--format=tiff \
--mode Color \
--resolution 300 \
--icc-profile /usr/share/color/icc/adobergb1998.icc \
-l 1mm \
-t 1mm \
-x 208mm \
-y 295mm \
-p \
-v \
> /home/user/Scans-Neu/tmp/"$zeitstempel".tif

# Konvertieren des TIFF-Bildes incl. Bildverbesserung
convert \
-gamma 1.0 \
-brightness-contrast 10x40 \
/home/user/Scans-Neu/tmp/"$zeitstempel".tif \
/home/user/Scans-Neu/tmp/"$zeitstempel"p.tif

## Konvertieren des TIFF-Bildes ins PS-Format und starte Druckjob
tiff2ps -z -w 8.27 -h 11.69 /home/user/Scans-Neu/tmp/"$zeitstempel"p.tif | lp -d "Druckername" -o fit-to-page -o fitplot

# Entfernen der temporaeren Dateien
rm /home/user/Scans-Neu/tmp/"$zeitstempel".tif
rm /home/user/Scans-Neu/tmp/"$zeitstempel"p.tif

Natürlich gibt es auch hier wieder viele Möglichkeiten, das Script zu individualisieren.

Viel Spaß beim Basteln!

Linktipp: explainshell.com

Wer wie ich gerne mit der Shell arbeitet, nutzt oftmals eine Vielzahl an Befehlskombinationen. Die erste Anlaufstelle hinsichtlich Shell-Befehlen sind sicherlich die Manpages, doch die Recherche der einzelnen Befehle und Parameter kann manchmal recht langwierig werden.

Will man schnell herausfinden, was sich z.B. hinter dem Shell-Kommando

du $HOME | sort -rn | less

verbirgt, kann man http://explainshell.com verwenden. Die Eingabe wird grafisch aufbereitet ausgegeben und auf die relevanten Abschnitte der betreffenden Manpages beschränkt, absolut empfehlenswert.