Hintergrundprozesse starten und bearbeiten: Jobmanagement. Prozesse und Jobverwaltung Ausführen eines Befehls im Linux-Hintergrund

💖 Gefällt es dir? Teilen Sie den Link mit Ihren Freunden

Einführung und Verarbeitung Hintergrundprozesse: Jobmanagement

Möglicherweise ist Ihnen das aufgefallen, nachdem Sie den Befehl eingegeben haben Terminal „E, Sie müssen normalerweise warten, bis der Vorgang abgeschlossen ist Hülse gibt Ihnen die Kontrolle zurück. Das bedeutet, dass Sie den Befehl ausgeführt habenPrioritätsmodus . Es gibt jedoch Zeiten, in denen dies nicht wünschenswert ist.

Nehmen wir zum Beispiel an, Sie beschließen, ein großes Verzeichnis rekursiv in ein anderes zu kopieren. Sie haben sich auch dafür entschieden, Fehler zu ignorieren, also haben Sie den Fehlerkanal auf umgeleitet/dev/null :

cp -R images/ /shared/ 2>/dev/null

Die Ausführung dieses Befehls kann mehrere Minuten dauern. Sie haben zwei Lösungen: Die erste ist grausam und bedeutet, den Befehl zu stoppen (zu töten) und ihn dann erneut auszuführen, jedoch zu einem angemesseneren Zeitpunkt. Klicken Sie dazu auf Strg+c : Dadurch wird der Vorgang beendet und Sie kehren zur Eingabeaufforderung zurück. Aber warten Sie, tun Sie das noch nicht! Weiter lesen.

Nehmen wir an, Sie möchten, dass ein Befehl ausgeführt wird, während Sie etwas anderes tun. Die Lösung wäre, den Prozess auszuführenHintergrund . Klicken Sie dazu auf Strg+z Um den Vorgang zu unterbrechen:

In diesem Fall setzt der Prozess seine Arbeit fort, jedoch als Hintergrundaufgabe, wie durch das Zeichen angezeigt & (kaufmännisches Und) am Ende der Zeile. Anschließend gelangen Sie zurück zur Eingabeaufforderung und können mit der Arbeit fortfahren. Ein Prozess, der als Hintergrundaufgabe oder in ausgeführt wird Hintergrund, genannt HintergrundAufgabe .

Natürlich können Sie Prozesse durch Hinzufügen des Zeichens sofort als Hintergrundaufgaben ausführen & am Ende des Befehls. Sie können beispielsweise den Befehl zum Kopieren des Verzeichnisses im Hintergrund ausführen, indem Sie Folgendes eingeben:

cp -R images/ /shared/ 2>/dev/null &

Wenn Sie möchten, können Sie diesen Vorgang auch im Vordergrund wiederherstellen und warten, bis er durch Eingabe abgeschlossen istfg (Vordergrund - Priorität). Um es wieder in den Hintergrund zu rücken, geben Sie die folgende Sequenz ein Strg+z , bg .

Auf diese Weise können Sie mehrere Aufgaben ausführen: Jedem Befehl wird eine Aufgabennummer zugewiesen. Team Schale „a Arbeitsplätze Zeigt eine Liste aller Jobs an, die mit dem aktuellen Job verknüpft sind Hülse "om. Vor der Aufgabe gibt es ein Schild + , markiert den letzten Prozess, der im Hintergrund ausgeführt wird. Um einen bestimmten Job wieder in den Prioritätsmodus zu versetzen, können Sie den Befehl eingebenfg , Wo - Aufgabennummer, zum Beispiel,fg 5 .

Der Linux-Terminaldienst läuft standardmäßig im Single-Tasking-Modus. Dies bedeutet, dass jede gestartete Besatzung das Terminal blockiert, bis es fertiggestellt ist. Dieser Ansatz ist nicht praktisch, wenn Programme ausgeführt werden, die eine lange Ausführungszeit erfordern. Dieses Problem kann auf zwei Arten gelöst werden: offen zusätzliches Fenster Terminal und führen Sie darin einen anderen Befehl aus oder verwenden Sie den Hintergrund. Alle aktuellen Betriebssysteme, einschließlich Linux, sind Multitasking-fähig, also die Fähigkeit, mehrere Programme gleichzeitig auszuführen.

So führen Sie eine Brigade im Hintergrund aus, um sofort auf die Benutzeroberfläche zuzugreifen Befehlszeile? Eine Crew, die zur Flucht gezwungen wurde, wird als Hintergrundprozess bezeichnet. Hintergrundprozesse werden nicht auf dem Bildschirm angezeigt. Beispielsweise läuft der Apache HTTPD-Server im Hintergrund, um Webseiten bereitzustellen. Sie können ein Shell-Skript oder einen beliebigen Befehl in den Modus mit niedriger Priorität versetzen. Eine Aufgabe (z. B. eine Crew oder ein Skript) kann in den Hintergrund gestellt werden, indem am Ende der Befehlszeile ein „&“ hinzugefügt wird. Diese Anweisung stellt den Befehl in den Hintergrund und gibt Speicherplatz im Terminal frei. Ein Team, das im Hintergrund läuft, wird als Job bezeichnet. Während der Hintergrundbefehl ausgeführt wird, ist es möglich, beliebige andere Befehle auszuführen. Die Syntax lautet wie folgt:

Befehl & Skriptname & /Pfad/zu/Befehl arg1 arg2 & Befehl-1 | Befehl-2 arg1 & Befehl-1 | command-2 -arg1 -arg2 >/path/to/output &

Um Programme im Hintergrund auszuführen, ohne das Terminalfenster zu blockieren, müssen Sie den speziellen „&“-Instruktor verwenden. Platzieren Sie dieses Zeichen ganz am Ende der Zeile, nachdem Sie den Befehlsnamen, die Optionen und die Eingabeparameter angegeben haben. Im Allgemeinen kann diese Sequenz als „Befehlsname -Option Eingabeparameter &“ geschrieben werden.

ls ~/* > ~/test-file.txt &
18960

Nach Drücken der Enter-Taste startet das Programm automatisch im Hintergrund. In diesem Fall zeigt das Terminal eine Zeile mit dem Inhalt „[task_number] Process_identifier“ an und fordert Sie zur Eingabe eines neu erstellten Befehls auf.

Finden Sie Befehle, die unter Linux im Hintergrund ausgeführt werden

Führen Sie den folgenden Befehl aus:

Beispiel einer Datenausgabe:

Ausführen von find / -iname "*.c" 2> /dev/null > /tmp/output.txt &
+ Ausführen von grep -R "hostNamed" / 2> /dev/null > /tmp/grep.txt &

Wo sind die Bestellkennungen?

Um zusätzlich zu den Standardumwandlungen Prozess-IDs für Job-IDs anzuzeigen, übergeben Sie die Option -l:

Beispiel einer Datenausgabe:

7307 Ausführen von find / -iname "*.c" 2> /dev/null > /tmp/output.txt &
+ 7324 Ausführen von grep -R "hostNamed" / 2> /dev/null > /tmp/grep.txt &

Um nur Prozess-IDs anzuzeigen, geben Sie Folgendes ein:

Beispiel einer Datenausgabe:

Stoppen Sie die Ausführung von Befehlen, die im Hintergrund ausgeführt werden

Um einen Prozess erzwungen oder ordnungsgemäß zu beenden, verwenden Sie den Befehl kill. Die Syntax lautet wie folgt:

PID töten
kill -15 PID
kill -9 PID
killall Prozess-Name-Hier
killall -15 Prozessname-hier
killall -9 Prozessname-hier

Zurücksetzen eines Programms in den Vordergrundmodus unter Linux

Unter Linux können Sie Programme nicht nur im Hintergrund ausführen, sondern auf Wunsch auch wieder in den normalen Ausführungsmodus versetzen. Dafür gibt es zwei Tools: den Befehl ( Ein Team ist eine Gruppe von Menschen, die durch gemeinsame Motive und Interessen verbunden sind.) fg und der %-Operator. Das Prinzip ihrer Bemühungen ist äußerst einfach. fg erfordert die Angabe der Jobnummer als Parameter und muss % direkt nach dem Operator ohne Leerzeichen ersetzt werden.

find / -name .ini 2> ~/results.txt &
19090
fg 1
bash: fg: Aufgabe beendet
+ Exit 1 find / -name .ini 2> ~/results.txt

Im Wesentlichen besteht das Betriebssystem aus einem Kernel und einer Vielzahl von Programmen, die verschiedene Aufgaben ausführen, das System warten und die Bedürfnisse des Benutzers erfüllen sollen. Fast alle Benutzerinteraktionen und Betriebssystem mit Programmen durchgeführt. Daher ist es für Anfänger wichtig zu verstehen, wie man ein Programm unter Linux ausführt, was beim Start passiert und welche Startmethoden es gibt.

Bevor wir mit dem Starten von Programmen fortfahren, müssen wir zunächst verstehen, was ein Programm ist. Unter Linux unterscheiden sich Programme von anderen Dateien nur dadurch, dass sie über ein gesetztes Executable-Flag verfügen. Darüber habe ich im Artikel bereits ausführlich geschrieben, daher werde ich es nicht wiederholen.

Alle Programme können in verschiedene Typen unterteilt werden:

  • Binäre Programme- Anweisungen an den Prozessor enthalten, die zur Ausführung bereit sind; die meisten Programme haben dieses Format, sie sind schnell und werden sofort vom System ausgeführt;
  • Bytecode-Programme- Dies sind keine Prozessoranweisungen mehr, sondern Anweisungen einer bestimmten virtuellen Maschine, die sie ausführen kann. Ohne eine virtuelle Maschine können solche Befehle nicht ausgeführt werden. Solche Programme verbrauchen mehr Ressourcen, sind aber auch recht schnell, ihr Vorteil ist, dass sie ohne Modifikation überall dort ausgeführt werden können, wo sie funktionieren virtuelle Maschine. Zu diesen Programmen gehören Java-Programme.
  • Skriptprogramme- Diese Programme bestehen aus einer Reihe von Befehlen im Klartext, die von einem speziellen Interpreter ausgeführt werden. Solche Programme sind langsamer, dafür aber einfacher zu entwickeln und ihr Code lässt sich einfach und schnell ändern.

Kommen wir nun zum Starten von Programmen.

Ausführen von Programmen im Terminal

Ursprünglich verfügten die Betriebssysteme Unix und Linux nicht über eine grafische Oberfläche, sodass Programme über Befehle vom Terminal aus gestartet wurden. Mittlerweile ist dies auch möglich und wird von erfahrenen Anwendern recht rege genutzt. Die Programmstartsyntax sieht folgendermaßen aus:

/Pfad/zur/Datei/Programm Optionen

Parameter werden nur dann angegeben, wenn sie benötigt werden, die Shell muss jedoch immer den vollständigen Pfad zum Programm kennen. Alles nach dem Programmnamen und einem Leerzeichen sind Parameter. Sie haben wahrscheinlich bereits bemerkt, dass wir beim Ausführen von Programmen normalerweise nicht den vollständigen Pfad angeben. Es wäre sehr langwierig und umständlich.

Die Entwickler haben einen Workaround gefunden. Es wurde eine PATH-Variable erstellt, die alle Pfade zu den Ordnern speichert, in denen sich Programme normalerweise befinden – /bin, /sbin, /usr/bin, /usr/sbin und so weiter. Sie können den Inhalt mit dem folgenden Befehl anzeigen:

Wenn Sie den Namen eines Programms eingeben, sucht das System in allen Ordnern im PATH nach einer ausführbaren Datei mit diesem Namen und führt sie aus, wenn es sie findet. Wenn keine solche Datei vorhanden ist, wird eine Meldung angezeigt – Befehl nicht gefunden. Also, um eines davon auszuführen Systemprogramme Geben Sie einfach den Namen der ausführbaren Datei ein, zum Beispiel:

Und Sie können Parameter nach einem Leerzeichen übergeben:

Wenn sich das Programm nicht in diesen Verzeichnissen befindet, müssen Sie den vollständigen Pfad dazu angeben:

/usr/local/bin/ls1

Wenn Sie das Programm über ausführen möchten Ubuntu-Terminal, das sich im aktuellen Ordner befindet, dann wird die Situation etwas anders sein. Das System durchsucht nur die Ordner in der PATH-Variablen; es durchsucht nicht das aktuelle Verzeichnis. Wenn Sie daher den Namen der ausführbaren Datei eingeben, erhalten Sie eine Fehlermeldung. Sie müssen den vollständigen Pfad angeben, so wie Sie ihn sich merken./:

Manchmal ist es notwendig, etwas Besonderes zu übertragen. Beispielsweise gibt die Variable EDITOR an, welche Texteditor sollte als Standard verwendet werden. Sie können einen Variablennamen und seinen Wert vor dem Befehlsnamen angeben, indem Sie die folgende Syntax verwenden:

Variablenname = Wertbefehl

Zum Beispiel:

HERAUSGEBER=Nanovisudo

Standardmäßig öffnet dieser Befehl die Einstellungen im Vim-Editor, jedoch mit diesem Umgebungsvariable Die Einstellungen werden im Nano-Editor geöffnet.

Programme als anderer Benutzer ausführen

Sie wissen bereits, wie Sie das Programm ausführen Linux-Terminal, was ist mit anderen Benutzern? Unter Windows ist es durchaus üblich, Programme als Administrator auszuführen, damit das Programm mehr Zugriffsrechte im System erhält. Unter Linux wird hierfür das Dienstprogramm sudo verwendet. Ihr Name kann als entziffert werden S Hexe u ser Tun- Benutzer wechseln und ausführen. Standardmäßig führt das Dienstprogramm den Befehl als Root-Superuser aus:

sudo-Befehl
Sudo whoami

Mit der Option -u können Sie das Programm jedoch als jeder am System angemeldete Benutzer ausführen:

sudo -u Benutzername-Befehl
sudo -u postgres whoami

Der Befehl whoami (wer bin ich) zeigt den Namen des aktuellen Benutzers an.

So führen Sie ein Programm im Hintergrund aus

Manchmal ist es notwendig, ein Programm mit langer Laufzeit im Terminal auszuführen, damit es die weitere Arbeit nicht beeinträchtigt. Dazu können Sie das Programm unter Linux im Hintergrund ausführen:

Programmname &

Zum Beispiel:

dd if=/dev/zero of=~/file count=100000 &

Das System gibt die PID aus, die eindeutige Kennung des Programms, mit der Sie es dann schließen können:

So führen Sie ein Skript unter Linux aus

Wir haben bereits gesagt, dass Programme in binäre und interpretierte Programme unterteilt werden. Bisher haben wir nur über Binärprogramme gesprochen. Um interpretierte Programme auszuführen, benötigen Sie direkt einen Interpreter; zu diesen Programmen gehören solche, die in Sprachen wie Java, Python, Perl, Ruby, PHP, NodeJS und vielen anderen geschrieben sind. Die Syntax zum Starten eines solchen Programms ist anders:

Dolmetscher /Pfad/zur/Datei/Programm Optionen

Verschiedene Interpreter verhalten sich unterschiedlich, daher ist es besser, sofort den vollständigen Pfad zum Programm anzugeben. Python ruft Skripte normalerweise aus dem aktuellen Ordner ab, ohne den vollständigen Pfad anzugeben:

Python hellowrld.py

Und Java-Programme müssen wie folgt gestartet werden:

java -jar program.jar

Für interpretierte Programmdateien ist das Ausführbarkeitsflag optional, da sie als Parameter an das Hauptprogramm übergeben werden. Nur Bash-Skripte sind eine Ausnahme. Sie können das Skript mit einem Interpreter ausführen:

Oder geben Sie einfach den Pfad zum Skript ein:

Die Shell selbst bestimmt ihre Skripte durch das Execuability-Flag und führt sie aus. Wenn das Ausführbarkeitsflag nicht gesetzt ist, sollten Sie es hinzufügen:

sudo chmod u+x ./script.sh

Daher wurden für die meisten interpretierten Programme einfache SH-Skripte erstellt, die schnell gestartet werden können.

Ausführen von Linux-Programmen in einer GUI

Es ist viel bequemer, Programme über zu starten GUI. Wenn es nicht möglich ist, Konsolenprogramme auf diese Weise zu starten, gibt es Verknüpfungen für alle grafischen Dienstprogramme, die Sie im Hauptmenü des Systems finden:

Darüber hinaus können Sie das Programm aus dem Dateimanager heraus per Doppelklick mit der Maus ausführen, allerdings muss dafür das Ausführbarkeitsflag gesetzt sein.

Das Ausführen von Skripten in einer GUI funktioniert auf die gleiche Weise. Sie finden alle Menüverknüpfungen im Verzeichnis /usr/share/applications/. Von hier aus kann jedes Programm per Doppelklick gestartet werden. Aber sehen wir uns an, was in der Verknüpfung enthalten ist. Öffnen Sie sie dazu in einem Texteditor:


Die Exec-Zeile gibt unter anderem den Befehl an, der ausgeführt wird Linux-Programme wenn Sie auf eine Verknüpfung doppelklicken. Sie können eine der vorhandenen Verknüpfungen verwenden und darauf basierend Ihre eigene erstellen. Dies ist einfach der Name des Programms. Es ist jedoch wichtig zu beachten, dass es besser ist, an Stellen wie Verknüpfungen, Skripten, Cron usw. den vollständigen Pfad anzugeben. Dadurch wird die Anzahl der Fehler verringert, da Sie nicht wissen können, ob das System in diesem Fall PATH überprüft oder Suche nach dem Programm nur im aktuellen Verzeichnis. Jetzt wissen Sie alles darüber, wie man ein Programm unter Linux ausführt.

Schlussfolgerungen

In diesem Artikel haben wir uns angeschaut, wie man ein Programm über das Ubuntu-Terminal oder anderswo ausführt Linux-Distributionen. Auch wenn dies ein sehr einfaches Thema zu sein scheint, gibt es einige interessante Punkte, was nützlich sein kann. Aber Sie kennen sie bereits. Wenn Sie Fragen haben, stellen Sie diese in den Kommentaren!

Wie jedes andere Multitasking-System führt Linux mehrere Prozesse gleichzeitig aus. Generell möchte ich Sie nicht in die Irre führen, denn ein normaler Einzelprozessor-Computer kann jeweils nur eine Aufgabe ausführen dieser Moment Zeit, weshalb Linux Prozesse zur Ausführung in die Warteschlange stellt.

Es gibt mehrere grundlegende Befehle zum Verwalten von Prozessen

  • PS- Zeigt eine Liste der laufenden Prozesse an
  • töten- sendet ein Signal an einen oder mehrere Prozesse (im Grunde, um sie zu „töten“)
  • Arbeitsplätze- eine alternative Möglichkeit, von Ihnen ausgeführte Prozesse anzuzeigen
  • bg- stellt die Prozessausführung in den Hintergrund
  • fg- bringt die Prozessausführung aus dem Hintergrund

Obwohl es den Anschein hat, dass dieses Wissen ziemlich abstrakt ist, kann es seinen Weg finden praktischer Nutzen selbst für den durchschnittlichen Benutzer, der eine GUI verwendet. Sie wissen vielleicht noch nicht, dass die Mehrheit Grafikprogramme(wenn nicht alle) können über die Befehlszeile gestartet werden. Versuchen wir zum Beispiel, den Browser zu starten. Ich denke, die meisten Linux-Geräte verfügen über oder Google Chrome oder Firefox

Enej@linux:/home/pub/www/vv$ google-chrome Neues Fenster in vorhandener Browsersitzung erstellt.

Sie können die URL angeben, die Sie öffnen möchten

Enej@linux:/home/pub/www/vv$ google-chrome http://site Neues Fenster in bestehender Browsersitzung erstellt.

Ich habe Chrome bereits über die GUI ausgeführt, sodass der Browser meldet, dass in einer bestehenden Sitzung ein neues Fenster erstellt wird, und die Steuerung an die Befehlszeile übergibt. Oder wenn Sie beispielsweise eine Grafik öffnen müssen Dateimanager mit Root-Rechten (das Beispiel funktioniert für die grafische Gnome-Shell mit installiertem Nautilus)

Enej@linux:/home/pub/www/vv$ sudo nautilus /root/ Passwort für enej:

Da der Prozess nicht im Hintergrund gestartet wurde, können Sie in diesem Terminalfenster keine Aktionen mehr ausführen (Sie können den Prozess mit STRG + C beenden).

Hintergrundmodus

Um das Leben einfacher zu machen, wird bei der Ausführung grafischer Programme oder Prozesse, die über einen längeren Zeitraum ausgeführt werden können, deren Ausführung normalerweise in den Hintergrund verschoben. Lassen Sie uns beispielsweise den Browser im Hintergrund ausführen

Enej@linux:/home/pub/www/vv$ google-chrome http://site & 9248

kaufmännisches Und-Zeichen ( & ) am Ende des Befehlsaufrufs bedeutet, dass die Prozessausführung im Hintergrund erfolgen soll. In diesem Fall ist es weiterhin möglich, mit diesem Terminalfenster zu arbeiten.

Aber plötzlich haben Sie vergessen, am Ende des Anrufs ein Ampresant zu setzen, dann gibt es einen anderen Weg. Sie müssen die Ausführung zunächst durch Drücken von STRG + Z stoppen, dann erhalten wir die Kontrolle über die Befehlszeile und können den Befehl aufrufen bg, was wir an letzter Stelle setzen werden laufender Prozess in den Hintergrund. Am Beispiel erzählt

Enej@linux:/home/pub/www/vv$ google-chrome http://site ^Z + Gestoppt google-chrome http://site enej@linux:/home/pub/www/vv$ bg + google- chrome http://site &

Team fg Bringt den zuletzt ausgeführten Prozess aus dem Hintergrund.

Liste der laufenden Prozesse

Da Sie jetzt wissen, wie man Befehle im Hintergrund ausführt, war es gut, eine Liste davon zu sehen. Verwenden Sie dazu den Befehl Arbeitsplätze oder stärker PS

Enej@linux:/home/pub/www/vv$ Jobs – nm-applet & (wd: ~/bin) ausführen + google-chrome http://site & enej@linux:/home/pub/www/vv ausführen $ ps PID TTY TIME CMD 2304 Punkte/0 00:00:02 Bash 11104 Punkte/0 00:00:01 Chrome 11108 Punkte/0 00:00:00 Chrome 11110 Punkte/0 00:00:00 Chrome 11132 Punkte/0 00:00:00 Chrome 12088 Punkte/0 00:00:00 PS 21165 Punkte/0 00:00:27 nm-Applet

Wie kann man einen Prozess „töten“?

Wenn ein Prozess nicht mehr reagiert (d. h. hängt), muss er zwangsweise „getötet“ werden. Ich denke, diejenigen, die FireFox verwenden, sind darauf gestoßen. Für solche Aufgaben wird der Befehl verwendet töten. Aber zuerst müssen Sie den Prozess irgendwie definieren. Dazu können Sie den Befehl verwenden Arbeitsplätze oder PS. Mit dem ersten können Sie die Prozessnummer ermitteln, mit dem zweiten dessen Kennung.

Enej@linux:/home/pub/www/vv$ google-chrome http://freaksidea..com & 15181 enej@linux:/home/pub/www/vv$ ps PID TTY TIME CMD 2304 pts/0 00: 00:02 bash 15181 Punkte/0 00:00:00 chrome 15238 Punkte/0 00:00:00 ps 21165 Punkte/0 00:00:27 nm-applet enej@linux:/home/pub/www/vv$ kill 15181

Mannschaften fg Und bg Als erstes Argument können sie die Nummer des laufenden Prozesses für dessen nachfolgende Ein-/Ausgabe in/aus dem Hintergrund übernehmen.

Erfahren Sie mehr über Töten

Eigentlich das Team töten Wird verwendet, um verschiedene Signale an Prozesse zu senden. In den meisten Fällen teilt dieses Signal dem Befehl lediglich mit, dass er beendet werden soll. Wenn Programme richtig geschrieben sind, achten sie auf verschiedene Signale des Betriebssystems und reagieren darauf. Beispielsweise muss ein Texteditor auf jedes Signal achten, das mitteilt, dass Benutzer abgemeldet werden oder der Computer heruntergefahren wird. Wenn er (der Texteditor) ein solches Signal „hört“, sollte er speichern offene Dokumente bevor Sie Ihre Arbeit beenden. Team töten kann verschiedene Arten von Signalen senden, um herauszufinden, welche, geben Sie ein töte -l. Nachfolgend finden Sie eine Liste der am häufigsten verwendeten Signale (die Zahl in Klammern gibt die Signalnummer an).

  • ANMELDEN(1)- sollte ursprünglich das Programm über den Kommunikationsverlust mit dem Steuerterminal informieren (Terminals wurden oft über Modems mit dem System verbunden, daher kommt der Name des Signals von aufgehängt – auflegen). Das SIGHUP-Signal wird auch an die Anwendung gesendet, wenn der Sitzungsleiterprozess seine Arbeit abgeschlossen hat. Viele Daemon-Programme, die keinen Sitzungsleiter haben, verarbeiten dieses Signal ebenfalls. Als Reaktion auf den Empfang eines SIGHUP wird der Daemon normalerweise neu gestartet (oder liest einfach die Konfigurationsdatei erneut). Standardmäßig wird das Programm, das dieses Signal empfängt, beendet.
  • SIGN(2)– Wird normalerweise an einen Prozess gesendet, wenn der Terminalbenutzer einen Befehl zum Beenden des Prozesses gegeben hat (normalerweise ist dieser Befehl die Tastenkombination Strg + C).
  • SIGTERM(15)- bewirkt eine „höfliche“ Beendigung des Programms. Nach Erhalt dieses Signals kann das Programm die erforderlichen Vorgänge vor dem Abschluss ausführen (z. B. das Speichern geöffneter Dokumente). Der Empfang von SIGTERM weist nicht auf einen Fehler im Programm hin, sondern vielmehr auf den Wunsch des Betriebssystems oder des Benutzers, es zu beenden.
  • SIGKILL(9)- Ursachen Beendigung erzwingen Programmbetrieb. Das Programm kann dieses Signal weder verarbeiten noch ignorieren.

Standardbefehl töten sendet SIGTERM Signal, Sie können aber auch die Signalnummer oder seinen Namen angeben. Nehmen wir an, Ihr Chrome ist eingefroren (manchmal funktioniert mein Flash-Player nicht mehr ordnungsgemäß).

Enej@linux:/home/pub/www/vv$ google-chrome http://site & 22066 enej@linux:/home/pub/www/vv$ jobs – nm-applet & ausführen (wd: ~/bin) + Ausführen von google-chrome http://site & enej@linux:/home/pub/www/vv$ kill -SIGTERM %2 enej@linux:/home/pub/www/vv$ kill -SIGKILL %2 enej@linux :/home/pub/www/vv$ kill -9 %2

P.S.: Ich denke, 2 Befehle werden für Anfänger sehr interessant sein: benachrichtigen-senden(sendet eine Nachricht über die grafische Shell, erscheint oben rechts in Gnome) und espeak(Sprachsynthesizer). Wenn Sie keine davon haben, können Sie sie mit dem Befehl installieren apt-get

Enej@linux:/home/pub/www/vv$ sudo apt-get install espeak notify-send

Letztes Mal haben wir über die Arbeit mit Eingabe-, Ausgabe- und Fehlerströmen in Bash-Skripten, Dateideskriptoren und Stream-Umleitung gesprochen. Jetzt wissen Sie bereits genug, um etwas Eigenes zu schreiben. In dieser Phase der Bash-Beherrschung haben Sie möglicherweise Fragen dazu, wie Sie laufende Skripte verwalten und ihren Start automatisieren können.

Bisher haben wir Skriptnamen in die Befehlszeile eingegeben und die Eingabetaste gedrückt, wodurch die Programme sofort ausgeführt wurden. Dies ist jedoch nicht die einzige Möglichkeit, Skripte aufzurufen. Heute werden wir darüber sprechen, wie ein Skript mit Linux-Signalen arbeiten kann, über verschiedene Ansätze zum Ausführen von Skripten und deren Verwaltung während der Ausführung.

Linux-Signale

Unter Linux gibt es mehr als drei Dutzend Signale, die vom System oder von Anwendungen generiert werden. Hier ist eine Liste der am häufigsten verwendeten, die sich bei der Entwicklung von Befehlszeilenskripten sicherlich als nützlich erweisen werden.
Signalcode
Name
Beschreibung
1
SEUFZEND
Schließung des Terminals
2
SIGNIEREN
Signal zum Stoppen des Prozesses durch den Benutzer vom Terminal aus (STRG + C)
3
SIGQUIT
Signal zum Stoppen eines Prozesses durch den Benutzer vom Terminal aus (STRG + \) mit einem Speicherauszug
9
SIGKILL
Bedingungslose Beendigung des Prozesses
15
SIGTERM
Signal zur Anforderung einer Prozessbeendigung
17
SIGSTOP
Erzwingen, dass ein Prozess angehalten, aber nicht beendet wird
18
SIGTSTP
Einen Prozess vom Terminal aus anhalten (STRG+Z), aber nicht herunterfahren
19
SIGCONT
Setzen Sie die Ausführung eines zuvor gestoppten Prozesses fort

Wenn die Bash-Shell beim Schließen des Terminals ein SIGHUP-Signal empfängt, wird sie beendet. Vor dem Beenden sendet es ein SIGHUP-Signal an alle darin ausgeführten Prozesse, einschließlich laufender Skripte.

Das SIGINT-Signal bewirkt, dass der Betrieb vorübergehend angehalten wird. Der Linux-Kernel weist der Shell keine Prozessorzeit mehr zu. In diesem Fall benachrichtigt die Shell die Prozesse, indem sie ihnen ein SIGINT-Signal sendet.

Bash-Skripte kontrollieren diese Signale nicht, können sie aber erkennen und bestimmte Befehle ausführen, um das Skript auf die durch die Signale verursachten Konsequenzen vorzubereiten.

Signale an Skripte senden

Mit der Bash-Shell können Sie mithilfe von Tastaturkürzeln Signale an Skripte senden. Dies ist sehr praktisch, wenn Sie ein laufendes Skript vorübergehend anhalten oder seinen Betrieb beenden müssen.

Beenden eines Prozesses

Die Tastenkombination STRG + C generiert ein SIGINT-Signal und sendet es an alle in der Shell laufenden Prozesse, wodurch diese beendet werden.

Lassen Sie uns den folgenden Befehl in der Shell ausführen:

$schlaf 100
Danach beenden wir die Arbeit mit der Tastenkombination STRG + C.


Beenden Sie einen Vorgang über die Tastatur

Den Prozess vorübergehend stoppen

Die Tastenkombination STRG + Z generiert das SIGTSTP-Signal, das den Prozess anhält, aber nicht beendet. Ein solcher Vorgang bleibt im Gedächtnis und seine Arbeit kann wieder aufgenommen werden. Lassen Sie uns den Befehl in der Shell ausführen:

$schlaf 100
Und stoppen Sie es vorübergehend mit der Tastenkombination STRG + Z.


Unterbrechen Sie den Vorgang

Nummer in eckige Klammern ist die Jobnummer, die die Shell dem Prozess zuweist. Die Shell behandelt darin laufende Prozesse als Jobs mit eindeutigen Nummern. Dem ersten Prozess wird die Nummer 1 zugewiesen, dem zweiten die Nummer 2 und so weiter.

Wenn Sie einen an eine Shell gebundenen Job anhalten und versuchen, ihn zu beenden, gibt Bash eine Warnung aus.

Sie können angehaltene Jobs mit dem folgenden Befehl anzeigen:

Ps –l


Aufgabenliste

In der Spalte S, die den Prozessstatus anzeigt, wird T für suspendierte Prozesse angezeigt. Dies zeigt an, dass der Befehl entweder ausgesetzt ist oder sich im Trace-Status befindet.

Wenn Sie einen angehaltenen Prozess beenden müssen, können Sie Folgendes verwenden: Tötungsbefehl. Einzelheiten dazu können Sie nachlesen.

Ihr Anruf sieht so aus:

Prozess-ID beenden

Signalabfang

Um die Linux-Signalverfolgung in einem Skript zu aktivieren, verwenden Sie den Befehl trap. Wenn das Skript das beim Aufruf dieses Befehls angegebene Signal empfängt, verarbeitet es es selbstständig, während die Shell ein solches Signal nicht verarbeitet.

Der Trap-Befehl ermöglicht es dem Skript, auf Signale zu reagieren, die andernfalls von der Shell ohne ihr Eingreifen verarbeitet würden.

Schauen wir uns ein Beispiel an, das zeigt, wie der Trap-Befehl den auszuführenden Code und eine durch Leerzeichen getrennte Liste von Signalen angibt, die wir abfangen möchten. In diesem Fall ist es nur ein Signal:

#!/bin/bash trap "echo " Trapped Strg-C"" SIGINT echo Dies ist ein Testskript count=1 while [ $count -le 10 ] do echo "Loop #$count" sleep 1 count=$(($ zählen + 1)) erledigt
Der in diesem Beispiel verwendete Trap-Befehl gibt eine Textnachricht aus, wenn er auf ein SIGINT-Signal stößt, das durch Drücken von Strg + C auf der Tastatur generiert werden kann.


Signalabfang

Jedes Mal, wenn Sie STRG + C drücken, führt das Skript den beim Aufruf von Trace angegebenen Echo-Befehl aus, anstatt ihn von der Shell beenden zu lassen.

Sie können das Skript-Exit-Signal abfangen, indem Sie beim Aufruf des Trap-Befehls den Namen des EXIT-Signals verwenden:

#!/bin/bash trap „echo Goodbye…“ EXIT count=1 while [ $count -le 5 ] do echo „Loop #$count“ sleep 1 count=$(($count + 1)) done


Abfangen des Skript-Exit-Signals

Wenn das Skript normal oder aufgrund eines SIGINT-Signals beendet wird, fängt die Shell den Echo-Befehl ab und führt ihn aus.

Änderung abgefangener Signale und Aufhebung des Abfangens

Um vom Skript abgefangene Signale zu ändern, können Sie den Trap-Befehl mit neuen Parametern ausführen:

#!/bin/bash trap „echo „Strg-C ist gefangen.““ SIGINT count=1 while [ $count -le 5 ] do echo „Loop #$count“ sleep 1 count=$(($count + 1) ) done trap „echo „Ich habe die Falle geändert!““ SIGINT count=1 while [ $count -le 5 ] do echo „Second Loop #$count“ sleep 1 count=$(($count + 1)) done


Modifikation der Signalüberwachung

Nach der Änderung werden die Signale auf neue Weise verarbeitet.

Das Abfangen von Signalen kann auch abgebrochen werden, indem Sie einfach den Trap-Befehl ausführen und ihm einen doppelten Bindestrich und den Signalnamen übergeben:

#!/bin/bash trap „echo „Strg-C ist gefangen.““ SIGINT count=1 while [ $count -le 5 ] do echo „Loop #$count“ sleep 1 count=$(($count + 1) ) done trap -- SIGINT echo „Ich habe gerade die Falle entfernt“ count=1 while [ $count -le 5 ] do echo „Second Loop #$count“ sleep 1 count=$(($count + 1)) done
Wenn das Skript ein Signal empfängt, bevor das Abfangen abgebrochen wird, verarbeitet es es wie in angegeben aktuelles Team fangen. Lassen Sie uns das Skript ausführen:

$ ./myscript
Und drücken Sie STRG + C auf der Tastatur.


Das Signal wurde abgefangen, bevor das Abfangen abgebrochen wurde.

Das erste Drücken von STRG + C erfolgte zum Zeitpunkt der Skriptausführung, als die Signalüberwachung aktiv war, sodass das Skript den dem Signal zugewiesenen Echobefehl ausführte. Nachdem die Ausführung den Unhook-Befehl erreicht hatte, funktionierte der Befehl STRG + C wie gewohnt und beendete das Skript.

Ausführen von Befehlszeilenskripten im Hintergrund

Manchmal dauert es lange, bis Bash-Skripte eine Aufgabe erledigen. Möglicherweise müssen Sie jedoch in der Lage sein, normal in der Befehlszeile zu arbeiten, ohne auf den Abschluss des Skripts warten zu müssen. Die Umsetzung ist gar nicht so schwer.

Wenn Sie die Liste der vom Befehl ps ausgegebenen Prozesse gesehen haben, sind Ihnen möglicherweise Prozesse aufgefallen, die im Hintergrund ausgeführt werden und nicht an ein Terminal gebunden sind.
Schreiben wir das folgende Skript:

#!/bin/bash count=1 while [ $count -le 10 ] do sleep 1 count=$(($count + 1)) done
Lassen Sie es uns ausführen, indem wir das kaufmännische Und-Zeichen (&) nach dem Namen angeben:

$ ./myscipt &
Dadurch wird es als Hintergrundprozess ausgeführt.


Ein Skript im Hintergrund ausführen

Das Skript wird in einem Hintergrundprozess gestartet, seine Kennung wird im Terminal angezeigt und wenn die Ausführung abgeschlossen ist, wird eine entsprechende Meldung angezeigt.

Beachten Sie, dass das Skript zwar im Hintergrund ausgeführt wird, das Terminal jedoch weiterhin zur Ausgabe von Nachrichten an STDOUT und STDERR verwendet, was bedeutet, dass der ausgegebene Text oder Fehlermeldungen im Terminal sichtbar sind.


Liste der Prozesse

Wenn Sie bei diesem Ansatz das Terminal verlassen, wird auch das im Hintergrund laufende Skript beendet.

Was ist, wenn Sie möchten, dass das Skript nach dem Schließen des Terminals weiter ausgeführt wird?

Ausführen von Skripten, die beim Schließen des Terminals nicht beendet werden

Skripte können auch nach Beenden der Terminalsitzung in Hintergrundprozessen ausgeführt werden. Dazu können Sie den Befehl nohup verwenden. Mit diesem Befehl können Sie ein Programm ausführen, indem Sie die an den Prozess gesendeten SIGHUP-Signale blockieren. Dadurch wird der Prozess auch dann ausgeführt, wenn Sie das Terminal verlassen, in dem er gestartet wurde.

Wenden wir diese Technik an, wenn wir unser Skript ausführen:

Nohup ./myscript &
Dies wird an das Terminal ausgegeben.


Team nohup

Der Befehl nohup trennt einen Prozess vom Terminal. Dies bedeutet, dass der Prozess Verweise auf STDOUT und STDERR verliert. Um die vom Skript ausgegebenen Daten nicht zu verlieren, leitet nohup in STDOUT und STDERR eingehende Nachrichten automatisch in die Datei nohup.out um.

Beachten Sie, dass, wenn Sie mehrere Skripte aus demselben Verzeichnis ausführen, deren Ausgabe in einer einzigen nohup.out-Datei landet.

Aufgaben anzeigen

Mit dem Befehl jobs können Sie aktuelle Jobs anzeigen, die in der Shell ausgeführt werden. Schreiben wir das folgende Skript:

#!/bin/bash count=1 while [ $count -le 10 ] do echo „Loop #$count“ sleep 10 count=$(($count + 1)) done
Lassen Sie es uns ausführen:

$ ./myscript
Und stoppen Sie es vorübergehend mit der Tastenkombination STRG + Z.


Ein Skript ausführen und anhalten

Lassen Sie uns dasselbe Skript im Hintergrund ausführen und dabei die Ausgabe des Skripts in eine Datei umleiten, sodass nichts auf dem Bildschirm angezeigt wird:

$ ./myscript > Ausgabedatei &
Wenn wir nun den Befehl „jobs“ ausführen, sehen wir Informationen sowohl über das angehaltene Skript als auch über das im Hintergrund laufende Skript.


Informationen zu Skripten abrufen

Der Schalter -l beim Aufruf des Jobs-Befehls zeigt an, dass wir Informationen zu Prozess-IDs benötigen.

Angehaltene Jobs werden neu gestartet

Um das Skript im Hintergrund neu zu starten, können Sie den Befehl bg verwenden.

Lassen Sie uns das Skript ausführen:

$ ./myscript
Drücken Sie STRG + Z, wodurch die Ausführung vorübergehend gestoppt wird. Lassen Sie uns den folgenden Befehl ausführen:

$bg


bg-Befehl

Das Skript läuft jetzt im Hintergrund.

Wenn Sie mehrere angehaltene Jobs haben, können Sie die Jobnummer an den Befehl bg übergeben, um einen bestimmten Job neu zu starten.

Um einen Job neu zu starten normaler Modus Verwenden Sie den fg-Befehl:

Planen Sie die Ausführung von Skripten

Linux bietet mehrere Möglichkeiten zum Ausführen von Bash-Skripten angegebene Zeit. Dies sind der at-Befehl und der Cron-Job-Scheduler.

Der at-Befehl sieht so aus:

Zur Zeit [-f Dateiname].
Dieser Befehl erkennt viele Zeitformate.

  • Standard, zeigt beispielsweise Stunden und Minuten an – 10:15.
  • Verwenden Sie AM/PM-Indikatoren, zum Beispiel vor oder nach Mittag – 22:15 Uhr.
  • Verwenden Sie spezielle Namen wie now , noon , midnight .
Neben der Möglichkeit, den Zeitpunkt anzugeben, zu dem ein Job ausgeführt werden soll, kann dem Befehl at auch ein Datum in einem seiner unterstützten Formate übergeben werden.
  • Ein Standarddatumsformat, in dem das Datum nach den Mustern MMTTJJ, MM/TT/JJ oder TT.MM.JJ geschrieben wird.
  • Eine Textdarstellung des Datums, zum Beispiel 4. Juli oder 25. Dezember, wobei das Jahr angegeben werden kann oder darauf verzichtet werden kann.
  • Aufnahme wie jetzt + 25 Minuten.
  • Aufnahmeansicht morgen um 22:15 Uhr.
  • Aufnahmetyp 10:15 + 7 Tage.
Gehen wir nicht näher auf dieses Thema ein, sondern schauen wir uns einen einfachen Anwendungsfall für den Befehl an:

$ at -f ./myscript jetzt


Planen von Jobs mit dem Befehl at

Der Schalter -M beim Aufruf von at wird zum Senden der Skriptausgaben verwendet Email, wenn das System entsprechend konfiguriert ist. Wenn Sie senden Email ist nicht möglich, dieser Schalter unterdrückt einfach die Ausgabe.

Um die Liste der Jobs anzuzeigen, die auf ihre Ausführung warten, können Sie den Befehl atq verwenden:


Liste der ausstehenden Aufgaben

Ausstehende Jobs löschen

Mit dem Befehl atrm können Sie einen ausstehenden Job löschen. Geben Sie beim Aufruf die Aufgabennummer an:

$atrm 18


Einen Auftrag löschen

Führen Sie Skripte nach einem Zeitplan aus

Wenn Sie Ihre Skripte mithilfe des Befehls „at“ so planen, dass sie einmal ausgeführt werden, kann dies in vielen Situationen das Leben erleichtern. Was aber, wenn das Skript jeden Tag, einmal pro Woche oder einmal im Monat zur gleichen Zeit ausgeführt werden soll?

Linux verfügt über ein Crontab-Dienstprogramm, mit dem Sie Skripte planen können, die regelmäßig ausgeführt werden müssen.

Crontab läuft im Hintergrund und führt basierend auf Daten in sogenannten Cron-Tabellen geplante Jobs aus.

Um eine vorhandene Cron-Job-Tabelle anzuzeigen, verwenden Sie den folgenden Befehl:

$ crontab –l
Wenn Sie ein Skript so planen, dass es nach einem Zeitplan ausgeführt wird, akzeptiert crontab Daten darüber, wann der Job ausgeführt werden muss, im folgenden Format:

Minute, Stunde, Tag des Monats, Monat, Wochentag.
Wenn Sie beispielsweise möchten, dass ein bestimmtes Skript mit dem Namen „command“ jeden Tag um 10:30 Uhr ausgeführt wird, entspricht dies dem folgenden Eintrag in der Aufgabentabelle:

30 10 * * * Befehl
Hier gibt der Platzhalter „*“, der für die Felder „Tag des Monats“, „Monat“ und „Wochentag“ verwendet wird, an, dass Cron den Befehl jeden Tag jedes Monats um 10:30 Uhr ausführen soll.

Wenn Sie beispielsweise möchten, dass das Skript jeden Montag um 16:30 Uhr ausgeführt wird, müssen Sie den folgenden Eintrag in der Aufgabentabelle erstellen:

30 16 * * 1 Befehl
Die Nummerierung der Wochentage beginnt bei 0, 0 bedeutet Sonntag, 6 bedeutet Samstag. Hier ist ein weiteres Beispiel. Hier wird der Befehl am ersten Tag jedes Monats um 12 Uhr mittags ausgeführt.

00 12 1 * * Befehl
Die Monate werden beginnend mit 1 nummeriert.
Um einen Eintrag zu einer Tabelle hinzuzufügen, müssen Sie crontab mit dem Schalter -e aufrufen:

Crontab –e
Anschließend können Sie Befehle zur Zeitplangenerierung eingeben:

30 10 * * * /home/likegeeks/Desktop/myscript
Dank dieses Befehls wird das Skript jeden Tag um 10:30 Uhr aufgerufen. Wenn der Fehler „Ressource vorübergehend nicht verfügbar“ auftritt, führen Sie den folgenden Befehl als Root aus:

$ rm -f /var/run/crond.pid
Sie können den regelmäßigen Start von Skripts mithilfe von Cron noch einfacher organisieren, indem Sie mehrere spezielle Verzeichnisse verwenden:

/etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly
Wenn Sie eine Skriptdatei in einer dieser Dateien platzieren, wird diese stündlich, täglich, wöchentlich oder monatlich ausgeführt.

Führen Sie Skripte beim Anmelden und Shell-Start aus

Sie können den Start von Skripten basierend auf verschiedenen Ereignissen automatisieren, z. B. der Benutzeranmeldung oder dem Shell-Start. Sie können über Dateien lesen, die in solchen Situationen verarbeitet werden. Dies sind beispielsweise die folgenden Dateien:

$HOME/.bash_profile $HOME/.bash_login $HOME/.profile
Um ein Skript bei der Anmeldung auszuführen, platzieren Sie seinen Aufruf in der Datei .bash_profile.

Wie wäre es mit der Ausführung von Skripten, wenn Sie ein Terminal öffnen? Die .bashrc-Datei hilft Ihnen dabei, dies zu organisieren.

Ergebnisse

Heute haben wir Fragen im Zusammenhang mit dem Management besprochen Lebenszyklus Skripte haben wir darüber gesprochen, wie man Skripte im Hintergrund ausführt und wie man ihre Ausführung plant. Lesen Sie das nächste Mal mehr über Funktionen in Bash-Skripten und die Bibliotheksentwicklung.

Liebe Leser! Verwenden Sie Tools, um Befehlszeilenskripts so zu planen, dass sie nach einem Zeitplan ausgeführt werden? Wenn ja, erzählen Sie uns bitte davon.



Freunden erzählen