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:
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.