5.6 Signale

Inhalt

Was sind Signale

Signale sind Ereignisse, welche für die Kommunikation zwischen zwei Prozessen (Interprozesskommunikation) verwendet werden können. Signale werden beispielsweise dazu verwendet, einen Prozess zu beenden. Im Lab 3 Troubleshooting hast du bereits gelernt, wie du mit dem kill Kommando einen Prozess beenden kannst. Das kill Kommando sendet dazu dem Prozess ein Signal (standardmässig TERM) welches anschliessend im Script verarbeitet werden kann. Angenommen du hast ein Script geschrieben, welches Daten verarbeitet und diese dazu in einer temporären Datei zwischenspeichert. Wenn du dieses Script nun beendest, möchtest du, dass diese temporäre Datei gelöscht wird. Dazu kannst du im Script einen Handler einbauen, welcher dieses Signal entgegennimmt und die gewünschte Aktion ausführt.

Signale in einem Script

Python

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/env python
import signal
import time
import os
import sys

tmpfile = "/tmp/tmpfile"

def signal_handler(_signo, _stack_frame):
    print("Removing tmp file")
    os.remove(tmpfile)
    print("Stopping script")
    sys.exit(0)

for sig in [signal.SIGTERM, signal.SIGINT]:
    signal.signal(sig, signal_handler)

while True:
    with open(tmpfile, "a") as file:
        file.write("processing\n")
    time.sleep(1)
    print("processing...")

Im obigen Script definieren wir eine Funktion signal_handler, welche beim Erhalt eines Signals ausgeführt werden soll. Auf Zeile 16 “verbinden” wir diesen Handler mit den Signalen SIGTERM und SIGINT. Das Script schreibt jede Sekunde eine Zeile in die Datei /tmp/tmpfile. Starte dieses Script auf deinem Computer und beobachte die temporäre Datei anschliessend mit dem Kommando tail -f /tmp/tmpfile. Beende das Script nach einigen Sekunden mit dem kill Kommando oder über CTRL+C. Du wirst feststellen, dass die temporäre Datei von der signal_handler() Funktion aufgeräumt wurde. Dieses Verhalten lässt sich auch mit einem Bash Script abbilden:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/bin/env bash

tmpfile="/tmp/tmpfile"

signal_handler() {
    echo "Removing tmp file"
    rm "${tmpfile}"
    echo "Stopping script"
    exit 0
}

trap signal_handler SIGTERM SIGINT

while true; do
    echo "processing" | tee -a "${tmpfile}"
    sleep 1
done