$ Schlaf 100 &[1] 9298
verwenden
pidofSie können die Prozess-ID des angegebenen Programmnamens anzeigen:
$ pidof sleep9298
$ cat /proc/9298/maps08048000-0804b000 r-xp 00000000 08:01 977399 /bin/sleep0804b000-0804c000 rw -p 00003000 08:01 977399 /bin/sleep0804c000-0806d000 rw-p 0804c000 00:00 0 [heap]b7c8b000-b7cca000 r--p 00000000 08:01 443354...bfbd8000-bfbed000 rw-p bfbd8000 00:00 0 [Stack]ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]
Nachdem das Programm ausgeführt wurde, wird es in den Speicher geladen und wird zu einem Prozess. Das Obige zeigt das Speicherabbild (virtueller Speicher) des Prozesses, einschließlich Programmanweisungen, Daten und etwas Stapelspeicher, der zum Speichern von Programmbefehlszeilenparametern und Umgebungsvariablen verwendet wird. Der für dynamische Speicheranwendungen verwendete Heap-Speicherplatz wurde zugewiesen.
Einzelheiten zum Programmausführungsprozess auf der Befehlszeile finden Sie unter „Der Moment der Programmausführung unter der Linux-Befehlszeile“.
Tatsächlich gibt es andere Möglichkeiten, einen Prozess zu erstellen, das heißt, das Programm laufen zu lassen. Durch einige Konfigurationen können Sie beispielsweise das Programm automatisch starten, wenn das System startet (Einzelheiten finden Sie unter
Mann init) oder durch Konfigurieren
crond(oder
bei), damit das Programm regelmäßig gestartet wird. Darüber hinaus gibt es eine andere Möglichkeit, ein Shell-Skript zu schreiben und das Programm in eine Skriptdatei zu schreiben. Wenn die Skriptdatei ausgeführt wird, wird das Programm in der Datei ausgeführt und zu einem Prozess. Die Details dieser Methoden werden nicht vorgestellt. Lassen Sie uns lernen, wie die Eigenschaften des Prozesses angezeigt werden.
Eine Sache, die hinzugefügt werden muss, ist: Um das Programm unter der Befehlszeile auszuführen, können Sie übergeben
ulimitIntegrierte Befehle werden verwendet, um die Ressourcen festzulegen, die ein Prozess nutzen kann, z. B. die maximale Anzahl von Dateideskriptoren, die ein Prozess öffnen kann, den maximalen Stapelspeicherplatz, den virtuellen Speicherplatz usw. Informationen zur spezifischen Verwendung finden Sie unter
helpulimit.
kann passieren
PSVerwenden Sie den Befehl, um prozessbezogene Attribute und Status anzuzeigen. Zu diesen Informationen gehören der Benutzer, zu dem der Prozess gehört, das dem Prozess entsprechende Programm und der
CPUund Speichernutzung und andere Informationen. Wenn Sie mit deren Anzeige vertraut sind, kann dies bei relevanten statistischen Analysen und anderen Vorgängen hilfreich sein.
Sehen Sie sich die Eigenschaften aller aktuellen Prozesse im System an:
$ ps -ef
Zeigen Sie den Prozess an, der dem Programm entspricht, das ein bestimmtes Zeichen im Befehl, Prozess, enthält
AUSWEISist 1.
TTYfür? Zeigt an, dass es nicht mit dem Terminal zusammenhängt:
$ ps -C init PID TTY TIME CMD 1 ?
Wählen Sie Prozesse aus, die von einem bestimmten Benutzer gestartet wurden:
$ ps -U Falke
Geben Sie den angegebenen Inhalt gemäß dem angegebenen Format aus. Im Folgenden werden der Befehlsname und ausgegeben
CPUNutzungsrate:
$ ps -e -o %C %c
CPUTop 4 der am häufigsten verwendeten Programme:
$ ps -e -o %C %c |. sort -u -k1 -r |. head -5 7.5 firefox-bin 1.1 Xorg 0.8 scim-panel-gtk 0.2 scim-bridge
Holen Sie sich die fünf Prozesse, die den größten virtuellen Speicher nutzen:
$ ps -e -o %z %c |. sort -n -k1 -r |. head -5349588 firefox-bin 96612 xfce4-terminal 88840 xfdesktop 76332 gedit 58920 scim-panel-gtk
Es besteht eine „verwandtschaftliche“ Beziehung zwischen allen Prozessen im System, die sein kann
pstreeSchauen Sie sich diese Beziehung an:
$ pstree
Der Systemprozessaufrufbaum wird oben gedruckt, und Sie können die Aufrufbeziehung zwischen allen aktiven Prozessen im aktuellen System deutlich sehen.
$ oben
Das größte Merkmal dieses Befehls ist, dass er Prozessinformationen dynamisch anzeigen kann. Natürlich bietet er auch einige andere Parameter, wie z
-SSie können es nach der kumulierten Ausführungszeit sortieren und anzeigen oder verwenden
-uProzesse anzeigen, die von einem bestimmten Benutzer usw. gestartet wurden.
Auffüllen:
SpitzeDer Befehl unterstützt interaktiv, zum Beispiel unterstützt er
uDer Befehl zeigt alle Prozesse des Benutzers an und unterstützt die Weitergabe
kBefehl zum Beenden eines Prozesses, falls verwendet
-n 1Option zum Aktivieren des Stapelverarbeitungsmodus, die spezifische Verwendung ist:
$ top -n 1 -b
Lassen Sie uns ein interessantes Problem besprechen: Wie kann man nur ein Programm gleichzeitig ausführen?
Dies bedeutet, dass ein Programm während der Ausführung nicht erneut gestartet werden kann. Was also tun?
Wenn dasselbe Programm in viele Kopien kopiert wird, unterschiedliche Dateinamen hat und an unterschiedlichen Orten abgelegt wird, wird dies noch schlimmer. Betrachten Sie daher den einfachsten Fall, das heißt, dieses Programm ist auf dem gesamten System eindeutig und der Name ist ebenfalls eindeutig . Wie lassen sich in diesem Fall die oben genannten Fragen beantworten?
Der allgemeine Mechanismus lautet: Überprüfen Sie zu Beginn des Programms, ob es ausgeführt wurde. Stoppen Sie es, andernfalls fahren Sie mit der Ausführung des nachfolgenden Codes fort.
Die Strategien sind vielfältig, da die vorherige Annahme die Einzigartigkeit des Programmdateinamens und -codes gewährleistet hat
PSDer Befehl findet die Programmnamen, die allen aktuellen Prozessen entsprechen, und vergleicht sie nacheinander mit dem eigenen Programmnamen. Wenn er bereits vorhanden ist, bedeutet dies, dass er bereits ausgeführt wurde.
ps -e -o %c |. tr -d |. grep -q ^init$ #Überprüfen Sie, ob das aktuelle Programm ausgeführt wird. && Exit #Wenn ja, dann gibt $? wurde erfolgreich ausgeführt
Überprüfen Sie bei jeder Ausführung zunächst, ob es einen Prozess gibt, der sich am angegebenen Speicherort speichert.
AUSWEISWenn die Datei nicht vorhanden ist, fahren Sie mit der Ausführung fort. Wenn sie vorhanden ist, sehen Sie sich den Prozess an
AUSWEISLäuft es? Wenn ja, beenden Sie es, andernfalls schreiben Sie den neuen Prozess neu in die Datei.
AUSWEIS, und fahren Sie fort.
pidfile=/tmp/$0.pidif [ -f $pidfile ]; then OLDPID=$(cat $pidfile) ps -e -o %p |. && exitfiecho $$ > $pidfile#... Code body# Legen Sie die Aktion von Signal 0 fest. Wenn das Programm beendet wird, wird das Signal ausgelöst, um den temporären Datei-Trap rm $pidfile 0 zu löschen
Nutzen Sie gerne selbst weitere Umsetzungsstrategien!
Das System stellt nicht nur sicher, dass jeder Prozess reibungslos ausgeführt werden kann, sondern verwendet auch bestimmte Planungsmethoden bei der Planung von Prozessen, um zu ermöglichen, dass bestimmte Aufgaben zuerst abgeschlossen werden, z. B. den allgemeinen Planungsalgorithmus der Zeitscheibenrotation nach Priorität. In diesem Fall können Sie bestehen
renicePassen Sie die Priorität eines laufenden Programms an, zum Beispiel: `
$ ps -e -o %p %c %n |
$ renice 1 -p 5089renice: 5089: setpriority: Vorgang nicht zulässig$ sudo renice 1 -p 5089 #Berechtigungen sind erforderlich [sudo] Passwort für Falcon:5089: alte Priorität 0, neue Priorität 1$ ps -e -o %p % c %n |. grep xfs #Schauen Sie noch einmal, die Priorität wurde angepasst 5089 xfs 1
Da Sie über die Befehlszeile ein Programm ausführen und einen Prozess erstellen können, gibt es auch eine Möglichkeit, ihn zu beenden. kann passieren
tötenDer Befehl sendet ein Signal an den vom Benutzer gestarteten Prozess, um den Prozess zu beenden. Dies ist natürlich „universell“.
Wurzelfast
tötenAlle Prozesse (außer
initdraußen). Zum Beispiel,
$ Sleep 50 & #Prozess starten [1] 11347 $ Kill 11347
tötenDer Befehl sendet standardmäßig ein Beendigungssignal (
SIGTERM) zum Programm hinzufügen und das Programm beenden lassen, aber
tötenEs können auch andere Signale gesendet und über definiert werden
Mann 7 SignalSie können es auch durchsehen
töte -lListen Sie es auf.
$ man 7 signal$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SIGALRM 15 ) SIGTERM 16) SIGSTKFLT17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+439) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+1247) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-1451) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-1055) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-659) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAX
Verwenden Sie zum Beispiel
tötenBefehl zum Senden
SIGSTOPSignalisieren Sie einem Programm, es anzuhalten und dann zu senden
SIGCONTDas Signal hält es am Laufen.
$ sleep 50 &[1] 11441$ jobs[1]+ Sleep 50 ausführen &$ kill -s SIGSTOP 11441 #Dies entspricht der Ausführung der STRG+Z-Operation für einen Vordergrundprozess $ jobs[1]+ Sleep 50$ gestoppt kill - s SIGCONT 11441 #Dies entspricht der vorherigen bg %1-Operation, mit der wir einen Hintergrundprozess ausgeführt haben $ jobs[1]+ Sleep 50 &$ kill ausführen %1 #In der aktuellen Sitzung können Sie den Prozess auch über die Jobnummer steuern $ jobs[1]+ Ruhezustand beendet 50
sichtbar
tötenDer Befehl bietet sehr gute Funktionen, kann aber nur auf dem Prozess basieren
AUSWEISoder Job, um den Prozess zu steuern, während
tötenUnd
killallEs stehen weitere Optionen zur Verfügung, die die Möglichkeiten erweitern, einen Prozess über seinen Programmnamen oder sogar seinen Benutzernamen zu steuern. Weitere Informationen zur Verwendung finden Sie in den entsprechenden Handbüchern.
Wie kann beim Beenden des Programms festgestellt werden, ob das Programm normal oder abnormal beendet wurde? Erinnern Sie sich noch an den Klassiker unter Linux?
Hallo WeltProgramm? Am Ende des Codes steht immer eine Zeile
0 zurückgebenStellungnahme. Das
0 zurückgebenDadurch kann der Programmierer tatsächlich überprüfen, ob der Prozess normal beendet wird. Wenn der Prozess einen anderen Wert zurückgibt, kann man mit Sicherheit sagen, dass der Prozess abnormal beendet wurde, weil er noch nicht ausgeführt wurde.
0 zurückgebenDiese Anweisung wird beendet.
Wie kann man also den Exit-Status des Prozesses überprüfen, also den zurückgegebenen Wert?
existieren
Hülse, können Sie diese spezielle Variable überprüfen
$?, das den Exit-Status speichert, nachdem der vorherige Befehl ausgeführt wurde.
$ test1bash: test1: Befehl nicht gefunden$ echo $?127$ cat ./test.c | $?0
Es scheint, dass die Rückgabe von 0 zu einer unausgesprochenen Regel geworden ist. Obwohl es keinen Standard gibt, der dies klar vorschreibt, kann das Programm immer zurückkehren, wenn es normal ist
$?0 wird in erkannt, aber wenn es abnormal ist, wird immer ein Wert ungleich 0 erkannt. Dies zeigt uns, dass es am Ende des Programms am besten ist, dem zu folgen
Ausgang 0damit jeder die Prüfung bestehen kann
$?Stellen Sie fest, ob das Programm normal endet. Wenn eines Tages jemand gelegentlich Ihr Programm verwendet und versucht, seinen Exit-Status zu überprüfen, Sie aber aus unerklärlichen Gründen eine zurückgeben
-1Oder 1, dann wird er sehr verzweifelt sein und sich fragen, wo das Problem in dem Programm liegt, das er selbst geschrieben hat. Er wird es lange prüfen, aber ratlos sein, weil er Ihnen so sehr vertraut, dass er nie an Ihren Programmiergewohnheiten zweifelt Von Anfang bis Ende wird es anders sein!
Um den Entwurf und die Implementierung zu erleichtern, wird eine große Aufgabe normalerweise in kleinere Module unterteilt. Verschiedene Module werden nach dem Start zu Prozessen. Wie kommunizieren sie miteinander, um Daten auszutauschen und zusammenzuarbeiten? Im Buch „Advanced Programming in UNIX Environment“ werden viele Methoden erwähnt, z. B. Pipes (unbenannte Pipes und benannte Pipes), Signale (
Signal), Nachricht (
Nachricht) Warteschlange (Nachrichtenwarteschlange), gemeinsam genutzter Speicher (
mmap/munmap), Semaphor (
Semaphor, wird hauptsächlich zur Synchronisierung zwischen Prozessen und zwischen verschiedenen Threads eines Prozesses verwendet), Sockets (
Buchse, Unterstützung der Prozesskommunikation zwischen verschiedenen Maschinen usw., und in Shell werden Rohre und Signale normalerweise direkt verwendet. Im Folgenden werden hauptsächlich einige Verwendungsmöglichkeiten von Pipes und Signalmechanismen in der Shell-Programmierung vorgestellt.
Unter Linux können Sie bestehen
|Verbinden Sie zwei Programme, sodass Sie damit den Eingang des letzteren Programms mit dem Ausgang des vorherigen Programms verbinden können. Daher wird es anschaulich als Pipe bezeichnet. In der C-Sprache ist es sehr einfach und bequem, eine unbenannte Pipe zu erstellen
RohrFunktion, die ein Zweielement übergibt
intEin Array vom Typ reicht aus. Dieses Array speichert tatsächlich zwei Dateideskriptoren. Nachdem der übergeordnete Prozess etwas in den ersten Dateideskriptor geschrieben hat, kann der untergeordnete Prozess es aus dem ersten Dateideskriptor lesen.
Wenn Sie zu viele Befehlszeilen verwenden, verwenden Sie diese Pipe
|Es sollte häufig verwendet werden. Oben gibt es zum Beispiel eine Demonstration
PSDie Ausgabe des Befehls ist wie folgt
grepBefehlseingabe:
$ ps -ef |. grep init
Sie denken vielleicht, dass diese „Pipe“ so magisch ist, dass sie tatsächlich die Eingabe und Ausgabe zweier Programme verknüpfen kann. Wenn ein solcher Befehlssatz eingegeben wird, führt die aktuelle Shell tatsächlich eine entsprechende Analyse durch, ordnet die Ausgabe des vorherigen Prozesses dem Ausgabedateideskriptor der Pipe zu und ordnet die Eingabe des nachfolgenden Prozesses dem Eingabedateideskriptor von zu Die Pipe. Dieser Assoziationsprozess funktioniert durch Eingabe und Ausgabe
Dup(oder
fcntl) zu erreichen.
Eine Named Pipe ist eigentlich eine Datei (eine unbenannte Pipe ist ebenfalls wie eine Datei. Obwohl sie mit zwei Dateideskriptoren verknüpft ist, kann sie nur auf der einen Seite gelesen und auf der anderen Seite geschrieben werden). muss während des Betriebs das First-In-First-Out-Prinzip erfüllen. Wenn Sie versuchen, von einer Named Pipe zu lesen, die keinen Inhalt hat, werden Sie blockiert. Ebenso werden Sie blockiert, wenn Sie versuchen, in eine Named Pipe zu schreiben, und kein Programm versucht, dies zu tun Um es zu lesen, werden Sie gesperrt. Sehen Sie sich den Effekt unten an.
$ mkfifo fifo_test #Erstellen Sie eine berühmte Pipe mit dem Befehl mkfifo. $ echo Fewfefe > fifo_test #Es wird versucht, Inhalt in die Datei fifo_test zu schreiben, diese ist jedoch blockiert. Sie müssen ein anderes Terminal öffnen, um die folgenden Vorgänge fortzusetzen. $ cat fifo_test #Öffnen Sie ein anderes Terminal , denken Sie daran, öffnen Sie ein anderes. Versuche den Inhalt von fifo_test Fewfefe auszulesen
Hier ist
EchoUnd
Katzesind zwei verschiedene Programme, in diesem Fall von
EchoUnd
KatzeZwischen den beiden gestarteten Prozessen besteht keine Eltern-Kind-Beziehung. Sie können jedoch weiterhin über Named Pipes kommunizieren.
Eine solche Kommunikationsmethode eignet sich für bestimmte Situationen sehr gut: Beispielsweise gibt es eine solche Architektur. Diese Architektur besteht aus zwei Anwendungen, von denen eine kontinuierlich eine Schleife durchliest.
fifo_testInhalt, um zu bestimmen, was als nächstes tun soll. Wenn diese Pipe keinen Inhalt hat, wird sie aufgrund einer Endlosschleife dort blockiert, ohne Ressourcen zu verbrauchen. Die andere wird als Steuerprogramm weiterlaufen.
fifo_testSchreiben Sie einige Steuerinformationen hinein, um dem vorherigen Programm mitzuteilen, was es tun soll. Schreiben Sie unten ein sehr einfaches Beispiel. Sie können einige Steuercodes entwerfen und dann fährt das Steuerprogramm damit fort
fifo_testSchreiben Sie hinein, und dann führt die Anwendung basierend auf diesen Steuercodes verschiedene Aktionen aus. Natürlich können Sie auch hingehen
fifo_testÜbergeben Sie andere Daten außer dem Steuercode.
Anwendungscode
$ cat app.sh #!/bin/bash FIFO=fifo_test while :; do CI=`cat $FIFO` #CI --> Control Info case $CI in 0) echo Die CONTROL-Nummer ist NULL, mach etwas ... ;; 1) echo Die CONTROL-Nummer ist EINS, tun Sie etwas ... ;; *) echo Die CONTROL-Nummer wird nicht erkannt, tun Sie etwas anderes ... ;;
Steuerprogrammcode
$ cat control.sh #!/bin/bash FIFO=fifo_test CI=$1 [ -z $CI ] && echo die Kontrollinformationen sollten nicht leer sein && exit echo $CI > $FIFO
Ein Programm steuert die Arbeit eines anderen Programms über Pipes
$ chmod +x app.sh control.sh #Ändern Sie die ausführbaren Berechtigungen dieser beiden Programme, damit Benutzer sie ausführen können. $ ./app.sh #Starten Sie diese Anwendung in einem Terminal und senden Sie die Steuerung über ./control.sh. Überprüfen Sie die Ausgabe nach dem Code ist die CONTROL-Nummer EINS, tun Sie etwas anderes ... #Nach dem Senden von 1 ist die CONTROL-Nummer NULL, tun Sie etwas ... #Nach dem Senden von 0 wird die CONTROL-Nummer nicht erkannt, tun Sie etwas anderes ... #Sende einen unbekannten Nach dem Steuercode $ ./control.sh 1 #In einem anderen Terminal Steuerinformationen senden, um die Arbeit der Anwendung zu steuern $ ./control.sh 0 $ ./control.sh 4343
Eine solche Anwendungsarchitektur eignet sich sehr gut für das lokale Multiprogramm-Aufgabendesign
Web-CGI, dann ist es auch für die Fernbedienungsanforderungen geeignet. einführen
Web-CGIDie einzige Änderung besteht im Steuerprogramm
./control.sheinstellen
Webvon
cgiVerzeichnis und nehmen Sie einige Änderungen daran vor, damit es den Anforderungen entspricht
CGISpezifikationen, die eine Darstellung des Dokumentausgabeformats enthalten (Ausgabe am Anfang der Datei erforderlich).
Inhaltstyp: text/htmlund eine Leerzeile) und die Erfassung von Eingabeparametern
(webEingabeparameter werden in gespeichert
QUERY_STRINGUmgebungsvariablen). Also ganz einfach
CGIDas Steuerprogramm kann wie folgt geschrieben werden:
#!/bin/bashFIFO=./fifo_testCI=$QUERY_STRING[ -z $CI ] && echo die Kontrollinformationen sollten nicht leer sein && excitecho -e content-type: text/htmlnnecho $CI > $FIFO
Bitte achten Sie bei der tatsächlichen Verwendung darauf
control.shzugreifen können
fifo_testPipe und verfügt über Schreibrechte zur Steuerung über den Browser
app.sh:
http://ipaddress_or_dns/cgi-bin/control.sh?0
Fragezeichen
?Der folgende Inhalt ist
QUERY_STRING, ähnlich dem vorherigen
1 $.
Eine solche Anwendung ist für die Fernsteuerung, insbesondere die Fernsteuerung eingebetteter Systeme, von großer praktischer Bedeutung. Im letztjährigen Sommerkurs haben wir auf diese Weise die Fernsteuerung von Motoren umgesetzt. Zunächst wird eine einfache Anwendung zur Steuerung der Motordrehung implementiert, einschließlich der Steuerung von Geschwindigkeit, Richtung usw. Um eine Fernsteuerung zu erreichen, haben wir einige Steuercodes entwickelt, um verschiedene Eigenschaften im Zusammenhang mit der Drehung des Motors zu steuern.
Wenn Sie in der C-Sprache eine benannte Pipe verwenden möchten, ähnelt diese Shell, außer dass Sie sie beim Lesen und Schreiben von Daten verwenden
lesen,
schreibenAnrufen, erstellen
fifoWird verwendet, wenn
mkfifoFunktionsaufruf.
Signale sind Software-Interrupts, über die Linux-Benutzer zugreifen können
tötenDer Befehl sendet ein bestimmtes Signal an einen Prozess, oder einige Signale können über die Tastatur gesendet werden, z
STRG+Ckann auslösen
SGIINTSignal, während
STRG+kann auslösen
SGIQUITSignale usw. Darüber hinaus sendet der Kernel unter bestimmten Umständen auch Signale an den Prozess, z. B. wenn auf Speicher außerhalb der Grenzen zugegriffen wird.
SGISEGVNatürlich können auch Signale und der Prozess selbst passieren
töten,
erhebenWarten Sie, bis die Funktion ein Signal an sich selbst sendet. Für die unter Linux unterstützten Signaltypen können Sie bestehen
Mann 7 Signaloder
töte -lSiehe entsprechende Listen und Anweisungen.
Für einige Signale verfügt der Prozess über Standardreaktionsaktionen, während der Prozess sie für einige Signale einfach ignorieren kann. Natürlich können Benutzer auch spezielle Verarbeitungsfunktionen für bestimmte Signale festlegen. In der Shell können Sie passieren
fangenBefehl (Shell-integrierter Befehl), um eine Aktion als Reaktion auf ein Signal (einen Befehl oder eine definierte Funktion) festzulegen, und in der Sprache C können Sie verwenden
SignalRufen Sie die für ein Signal registrierte Handlerfunktion auf. Dies ist nur eine Demonstration
fangenVerwendung des Befehls.
$ function signal_handler { echo hello, world.; } #Definieren Sie die signal_handler-Funktion $ trap signal_handler SIGINT #Führen Sie diese Befehlseinstellung aus: Drucken Sie hallo, Welt, wenn Sie das SIGINT-Signal empfangen. $ hallo, Welt #Drücken Sie STRG+C, um den Bildschirm anzuzeigen. Das Hallo und Weltstrings werden ausgegeben
Wenn Sie die Antwortaktion des Signals 0 festlegen, können Sie es ebenfalls verwenden
fangenZur Simulation des C-Sprachprogramms
atexitRegistrierung der Programmbeendigungsfunktion, das heißt durch
trap signal_handler SIGQUITSatz
signal_handlerDie Funktion wird ausgeführt, wenn das Programm beendet wird. Signal 0 ist ein spezielles Eingangssignal
POSIX.1Signalnummer 0 wird als Nullsignal definiert, das häufig verwendet wird, um festzustellen, ob ein bestimmter Prozess noch existiert. Dieses Signal wird ausgelöst, wenn ein Programm beendet wird.
$ cat sigexit.sh#!/bin/bashfunction signal_handler { echo hello, world}trap signal_handler 0$ chmod +x sigexit.sh$ ./sigexit.sh #Die tatsächliche Shell-Programmierung verwendet diese Methode, um einige Aufräumarbeiten durchzuführen, wenn das Programm beendet wird Abschlussarbeiten an temporären Dateien Hallo Welt
Wenn wir mehrere Befehle weiterleiten
|,>,<, ;, (,)In Kombination startet diese Befehlsfolge normalerweise mehrere Prozesse, die über Pipes usw. kommunizieren. Manchmal gibt es beim Ausführen einer Aufgabe andere Aufgaben, die verarbeitet werden müssen. Daher fügen Sie am Ende der Befehlssequenz häufig ein & hinzu oder drücken nach der Ausführung des Befehls
STRG+ZBewirkt, dass der vorherige Befehl angehalten wird. um andere Aufgaben zu erledigen. Nachdem Sie einige andere Aufgaben erledigt haben, bestehen Sie
fgDer Befehl schaltet die Hintergrundaufgabe in den Vordergrund. Ein solcher Steuerungsprozess wird üblicherweise Jobsteuerung genannt, und diese Befehlssequenzen werden Jobs genannt. Dieser Job kann ein oder mehrere Programme, einen oder mehrere Prozesse umfassen. Im Folgenden werden einige häufig verwendete Jobsteuerungsvorgänge demonstriert.
$ Schlaf 50 &[1] 11137
Verwenden Sie die in Shell integrierten Befehle
fgBringen Sie Job 1 in den Vordergrund und drücken Sie
STRG+ZUnterbrechen Sie den Vorgang
$ fg %1sleep 50^Z[1]+ Sleep 50 gestoppt
$ jobs # Überprüfen Sie den aktuellen Jobstatus, ein Job ist gestoppt [1] + Stopped Sleep 50$ Sleep 100 & # Lassen Sie einen anderen Job im Hintergrund laufen [2] 11138$ Jobs # Überprüfen Sie den aktuellen Jobstatus, einer läuft und einer wird gestoppt [ 1]+ Ruhezustand gestoppt 50[2]- Ruhezustand läuft 100 &
$ bg %1[2]+ Schlaf 50 &
Um die Jobsteuerung jedoch über die Befehlszeile verwenden zu können, müssen die aktuelle Shell, der Kernel-Terminaltreiber usw. die Jobsteuerung unterstützen.
„Fortgeschrittene Programmierung in der UNIX-Umgebung“