GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux Bash Scripting Part5 – Signale und Jobs

Im vorherigen Beitrag haben wir über Eingabe, Ausgabe und Umleitung in Bash-Skripten gesprochen. Heute lernen wir, wie man sie auf einem Linux-System ausführt und steuert. Bis jetzt können wir Skripte nur über die Befehlszeilenschnittstelle ausführen, aber dies ist nicht die einzige Möglichkeit, Linux-Bash-Skripte auszuführen.

Dieser Beitrag beschreibt die verschiedenen Möglichkeiten zur Steuerung Ihrer Linux-Bash-Skripte.

Linux-Signale

Dies sind die häufigsten Linux-Systemsignale:

Anzahl Name Stelle
1 SIGHUP Prozess hängt sich auf.
2 SIGNAL Prozessunterbrechung.
3 SIGQUIT Prozesse beenden oder stoppen.
9 SIGKILL Prozessbeendigung.
15 SIGTERM Prozessbeendigung.
17 SIGSTOP Prozess stoppt ohne Beendigung.
18 SIGTSTP Prozess stoppt oder pausiert ohne Beendigung.
19 SIGCONT Prozessfortsetzung nach Stopp.

Ihre Linux-Bash-Skripte steuern diese Signale nicht. Sie können Ihr Bash-Skript so programmieren, dass es Signale erkennt und Befehle basierend auf dem gesendeten Signal ausführt.

Stoppen Sie einen Prozess

Um einen laufenden Prozess zu stoppen, können Sie Strg+C drücken, wodurch ein SIGINT-Signal generiert wird, um den aktuellen Prozess in der Shell zu stoppen.

$ sleep 100

Strg+C

Einen Prozess pausieren

Die Tasten Strg+Z erzeugen ein SIGTSTP-Signal, um alle Prozesse zu stoppen, die in der Shell laufen, und das Programm bleibt im Speicher.

$ sleep 100

Strg+Z

Die Zahl in Klammern (1) ist die Auftragsnummer.

Wenn Sie versuchen, die Shell zu verlassen, und Ihrer Shell ein angehaltener Job zugewiesen ist, warnt Sie die Bash, falls Sie.

Sie können den Befehl ps verwenden, um die angehaltenen Jobs anzuzeigen.

ps –l

In der Spalte S (Process State) werden die Zustände Traced (T) oder Stoped (S) angezeigt.

Wenn Sie einen angehaltenen Job beenden möchten, können Sie seinen Prozess mit dem Befehl kill beenden.

kill processID

Trap-Signale

Um Signale abzufangen, können Sie den Trap-Befehl verwenden . Wenn das Skript ein durch den Trap-Befehl definiertes Signal erhält, stoppt es die Verarbeitung und stattdessen verarbeitet das Skript das Signal.

Sie können Signale mit dem Trap-Befehl wie folgt abfangen:

#!/bin/bash

trap "echo 'Ctrl-C was trapped'" SIGINT

total=1

while [ $total -le 3 ]; do

	echo "#$total"

	sleep 2

	total=$(($total + 1))

done

Jedes Mal, wenn Sie Strg+C drücken, wird das Signal abgefangen und die Nachricht gedruckt.

Wenn Sie Strg+C drücken, wird die im Trap-Befehl angegebene echo-Anweisung ausgegeben, anstatt das Skript zu stoppen. Cool, oder?

Abfangen des Skriptausgangs

Sie können den Shell-Skript-Exit mit dem folgenden trap-Befehl abfangen:

#!/bin/bash

# Add the EXIT signal to trap it

trap "echo Goodbye..." EXIT

total=1

while [ $total -le 3 ]; do

	echo "#$total"

	sleep 2

	total=$(($total + 1))

done

Wenn das Bash-Skript beendet wird, wird die Goodbye-Nachricht wie erwartet gedruckt.

Wenn Sie das Skript beenden, bevor Sie seine Arbeit beendet haben, wird die EXIT-Falle ausgelöst.

Ändern oder Entfernen einer Falle

Sie können den Trap-Befehl mit neuen Optionen wie diesen erneut ausgeben:

#!/bin/bash

trap "echo 'Ctrl-C is trapped.'" SIGINT

total=1

while [ $total -le 3 ]; do

	echo "Loop #$total"

	sleep 2

	total=$(($total + 1))

done

# Trap the SIGINT

trap "echo ' The trap changed'" SIGINT

total=1

while [ $total -le 3 ]; do

	echo "Second Loop #$total"

	sleep 1

	total=$(($total + 1))

done

Beachten Sie, wie das Skript das Signal verwaltet, nachdem die Signalfalle geändert wurde.

Sie können auch eine Falle entfernen durch die Verwendung von zwei Bindestrichen.

trap -- SIGNAL
#!/bin/bash

trap "echo 'Ctrl-C is trapped.'" SIGINT

total=1

while [ $total -le 3 ]; do

	echo "#$total"

	sleep 1

	total=$(($total + 1))

done

trap -- SIGINT

echo "I just removed the trap"

total=1

while [ $total -le 3 ]; do

	echo "Loop #2 #$total"

	sleep 2

	total=$(($total + 1))

done

Beachten Sie, wie das Skript das Signal vor dem Entfernen des Trap und nach dem Entfernen des Trap verarbeitet.

$ ./myscript

Strg+C

Das erste Strg+C wurde abgefangen, und das Skript läuft weiter, während das zweite das Skript beendet, weil die Falle entfernt wurde.

Linux-Bash-Skripte im Hintergrundmodus ausführen

Wenn Sie die Ausgabe des Befehls ps sehen, sehen Sie alle laufenden Prozesse im Hintergrund und nicht an das Terminal gebunden.

Wir können dasselbe tun, platzieren Sie einfach das kaufmännische Und-Symbol (&) nach dem Befehl.

#!/bin/bash

total=1

while [ $total -le 3 ]; do

	sleep 2

	total=$(($total + 1))

done
$ ./myscipt &

Sobald Sie das getan haben, wird das Skript in einem separaten Hintergrundprozess auf dem System ausgeführt, und Sie können die Prozess-ID zwischen den eckigen Klammern sehen.

Wenn das Skript beendet wird,  sehen Sie eine Meldung auf dem Terminal.

Beachten Sie, dass Sie, während der Hintergrundprozess läuft, Ihren Terminal-Monitor für STDOUT- und STDERR-Meldungen verwenden können, so dass Sie, wenn ein Fehler auftritt, die Fehlermeldung und die normale Ausgabe sehen werden.

Der Hintergrundprozess wird beendet, wenn Sie Ihre Terminalsitzung beenden.

Was also, wenn Sie weiterlaufen möchten, auch wenn Sie das Terminal schließen?

Skripte ohne Auflegen ausführen

Sie können Ihre Linux-Bash-Skripts im Hintergrundprozess ausführen, selbst wenn Sie die Terminalsitzung mit dem nohup-Befehl beenden .

Der Befehl nohup blockiert alle SIGHUP-Signale. Es verhindert, dass der Prozess beendet wird, wenn Sie Ihr Terminal verlassen.

$ nohup ./myscript &

Nachdem Sie den Befehl nohup ausgeführt haben, können Sie keine Ausgabe oder Fehler von Ihrem Skript sehen. Sie haben die Ausgabe- und Fehlermeldungen an eine Datei namens nohup.out gesendet .

Hinweis:Wenn mehrere Befehle aus demselben Verzeichnis ausgeführt werden, wird der Inhalt der nohup.out-Datei überschrieben.

Jobs anzeigen

Um die aktuellen Jobs anzuzeigen, können Sie den Befehl jobs verwenden.

#!/bin/bash

total=1

while [ $total -le 3 ]; do

	echo "#$count"

	sleep 5

	total=$(($total + 1))

done

Führen Sie es dann aus.

$ ./myscript

Drücken Sie dann Strg+Z, um das Skript zu stoppen.

Führen Sie das gleiche Bash-Skript aus, aber im Hintergrund, verwenden Sie das kaufmännische Und-Symbol und leiten Sie die Ausgabe nur zur Verdeutlichung in eine Datei um.

$ ./myscript > outfile &

Der Befehl jobs zeigt die angehaltenen und laufenden Jobs an.

jobs –l

-l Parameter, um die Prozess-ID anzuzeigen

Angehaltene Jobs neu starten

Sie können den Befehl bg verwenden, um einen Job im Hintergrundmodus neu zu starten.

$ ./myscript

Drücken Sie dann Strg+Z

Jetzt wird es gestoppt.

$ bg

Nach der Verwendung des bg-Befehls läuft es jetzt im Hintergrundmodus.

Wenn Sie mehrere angehaltene Jobs haben, können Sie dasselbe tun, indem Sie die Jobnummer im bg-Befehl angeben.

Sie können den fg-Befehl verwenden um einen Job im Vordergrundmodus neu zu starten.

$ fg 1

Einen Auftrag planen

Das Linux-System bietet zwei Möglichkeiten, ein Bash-Skript zu einem vordefinierten Zeitpunkt auszuführen:

  • auf Befehl.
  • cron-Tabelle.

Der at-Befehl

Dies ist das Format des Befehls

um [-f Dateiname] Zeit

Der at-Befehl kann verschiedene Zeitformate akzeptieren:

  • Standardzeitformat wie 10:15.
  • Ein AM/PM-Indikator wie 23:15 Uhr.
  • Eine benannte Zeit wie jetzt, Mitternacht.

Sie können ein bestimmtes Datum mit verschiedenen Datumsformaten einfügen:

  • Ein Standard-Datumsformat wie MMTTJJ oder TT.MM.JJ.
  • Ein Textdatum, z. B. 10. Juni oder 12. Februar, mit oder ohne Jahreszahl.
  • Jetzt + 25 Minuten.
  • Morgen 05:15 Uhr.
  • 11:15 + 7 Tage.

Wir wollen nicht tief in den at-Befehl eintauchen, aber machen Sie es sich vorerst einfach.

$ at -f ./myscript now

Sie können den Parameter -M verwenden, um die Ausgabe per E-Mail zu senden, wenn das System über E-Mail verfügt, und wenn dies nicht der Fall ist, wird dies die Ausgabe des at-Befehls unterdrücken.

Um die ausstehenden Jobs aufzulisten, verwenden Sie den atq-Befehl:

Ausstehende Jobs entfernen

Um einen ausstehenden Job zu entfernen, verwenden Sie den atrm-Befehl:

$ atrm 18

Sie müssen die Jobnummer für den atrm-Befehl angeben.

Planungsskripts

Was ist, wenn Sie ein Skript jeden Tag oder jeden Monat oder so zur gleichen Zeit ausführen müssen?

Sie können den crontab-Befehl verwenden, um Jobs zu planen.

Um die geplanten Jobs aufzulisten, verwenden Sie den Parameter -l:

$ crontab –l

Das Format für crontab ist:

Minute, Stunde, Tag des Monats, Monat und Tag der Woche

Wenn Sie also täglich um 10:30 Uhr einen Befehl ausführen möchten, geben Sie Folgendes ein:

30 10 * * * Befehl

Das Platzhalterzeichen (*) wird verwendet, um anzugeben, dass der Cron den Befehl täglich um 10:30 Uhr ausführt.

Um jeden Dienstag um 17:30 Uhr einen Befehl auszuführen, würden Sie Folgendes verwenden:

30 17 * * 2 Befehl

Der Wochentag beginnt bei 0 bis 6, wobei Sonntag =0 und Samstag =6 ist.

So führen Sie jeden Monatsanfang um 10:00 Uhr einen Befehl aus:

00 10 1 * * Befehl

Der Tag des Monats ist von 1 bis 31.

Lassen Sie es uns vorerst einfach halten und wir werden den Cron in zukünftigen Beiträgen ausführlich besprechen.

Um die Cron-Tabelle zu bearbeiten, verwenden Sie den Parameter -e wie folgt:

crontab –e

Geben Sie dann Ihren Befehl wie folgt ein:

 30 10 * * * /home/likegeeks/Desktop/myscript

Dadurch wird unser Skript so geplant, dass es jeden Tag um 10:30 Uhr ausgeführt wird.

Hinweis:Manchmal sehen Sie den Fehler, dass die Ressource vorübergehend nicht verfügbar ist.

Alles, was Sie tun müssen, ist Folgendes:

$ rm -f /var/run/crond.pid

Sie sollten dazu ein Root-Benutzer sein.

So einfach!

Sie können eines der vorkonfigurierten Cron-Skriptverzeichnisse verwenden wie:

/etc/cron.hourly

/etc/cron.daily

/etc/cron.weekly

/etc/cron.monthly

Legen Sie einfach Ihre Bash-Skriptdatei in einem dieser Verzeichnisse ab, und sie wird regelmäßig ausgeführt.

Skripte beim Login starten

In den vorherigen Beiträgen haben wir über Startdateien gesprochen. Ich empfehle Ihnen, sie zu überprüfen.

$HOME/.bash_profile

$HOME/.bash_login

$HOME/.profil

Um Ihre Skripte bei der Anmeldung auszuführen, platzieren Sie Ihren Code in

$HOME/.bash_profile

.

Starten von Skripten beim Öffnen der Shell

OK, was ist mit dem Ausführen unseres Bash-Skripts, wenn die Shell geöffnet wird? Ganz einfach.

Geben Sie Ihr Skript ein

 .bashrc

Datei.

Und wenn Sie jetzt das Shell-Fenster öffnen, wird dieser Befehl ausgeführt.

Ich hoffe, Sie finden den Beitrag nützlich. Komm immer wieder.

Danke.


Linux
  1. Kommunikation zwischen Prozessen in Linux:Sockets und Signale

  2. So finden und töten Sie den Zombie-Prozess in Linux

  3. mmap-, msync- und Linux-Prozessbeendigung

  4. Linux-Prozess im Hintergrund - In Jobs gestoppt?

  5. Linux:Disowned-Prozess anzeigen und beenden

So verwenden Sie den Datumsbefehl in Bash-Skripten unter Linux

Cron-Jobs und Crontab unter Linux erklärt

Linux Bash Scripting Part5 – Signale und Jobs

So löschen Sie den Bash-Verlauf in Linux und Mac

Bash-Skripting:So geben Sie Text in der Linux-Shell aus und formatieren ihn

So verfolgen und verfolgen Sie einen Linux-Prozess