Im Allgemeinen hat der Lebenszyklus eines Anwendungsprozesses drei Hauptzustände:Start, Ausführung und Stopp. Jeder Staat kann und sollte sorgfältig verwaltet werden, wenn wir kompetente Verwalter sein wollen. Diese acht Befehle können verwendet werden, um Prozesse über ihren Lebenszyklus hinweg zu verwalten.
Starten eines Prozesses
Der einfachste Weg, einen Prozess zu starten, besteht darin, seinen Namen in der Befehlszeile einzugeben und die Eingabetaste zu drücken. Wenn Sie einen Nginx-Webserver starten möchten, geben Sie nginx ein . Vielleicht möchten Sie nur die Version überprüfen.
alan@workstation:~$ nginx
alan@workstation:~$ nginx -v
nginx-Version:nginx/1.14.0
Ihren ausführbaren Pfad anzeigen
Die obige Demonstration zum Starten eines Prozesses geht davon aus, dass sich die ausführbare Datei in Ihrem ausführbaren Pfad befindet. Das Verständnis dieses Pfads ist der Schlüssel zum zuverlässigen Starten und Verwalten eines Prozesses. Administratoren passen diesen Pfad häufig für ihren gewünschten Zweck an. Sie können Ihren ausführbaren Pfad mit echo $PATH anzeigen .
alan@workstation:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
WELCHE
Verwenden Sie den which-Befehl, um den vollständigen Pfad einer ausführbaren Datei anzuzeigen.
alan@workstation:~$ which nginx
/opt/nginx/bin/nginx
Ich werde für meine Beispiele die beliebte Webserver-Software Nginx verwenden. Nehmen wir an, dass Nginx installiert ist. Wenn der Befehl what nginx gibt nichts zurück, dann wurde Nginx nicht gefunden, da nur Ihr definierter ausführbarer Pfad gesucht wird. Es gibt drei Möglichkeiten, eine Situation zu beheben, in der ein Prozess nicht einfach mit dem Namen gestartet werden kann. Die erste besteht darin, den vollständigen Pfad einzugeben. Obwohl ich das alles lieber nicht tippen müsste, oder?
alan@workstation:~$ /home/alan/web/prod/nginx/sbin/nginx -v
nginx-Version:nginx/1.14.0
Das Linux-Terminal
- Die 7 besten Terminalemulatoren für Linux
- 10 Befehlszeilentools für die Datenanalyse unter Linux
- Jetzt herunterladen:SSH-Spickzettel
- Spickzettel für fortgeschrittene Linux-Befehle
- Linux-Befehlszeilen-Tutorials
Die zweite Lösung wäre, die Anwendung in einem Verzeichnis im Pfad Ihrer ausführbaren Datei zu installieren. Dies ist jedoch möglicherweise nicht möglich, insbesondere wenn Sie keine Root-Rechte haben.
Die dritte Lösung besteht darin, die Umgebungsvariable für den ausführbaren Pfad so zu aktualisieren, dass sie das Verzeichnis enthält, in dem die spezifische Anwendung, die Sie verwenden möchten, installiert ist. Diese Lösung ist Shell-abhängig. Beispielsweise müssten Bash-Benutzer die Zeile PATH=in ihrer .bashrc-Datei bearbeiten.
PATH="$HOME/web/prod/nginx/sbin:$PATH"
Wiederholen Sie nun Ihr Echo und welche Befehle oder versuchen Sie, die Version zu überprüfen. Viel einfacher!
alan@workstation:~$ echo $PATH
/home/alan/web/prod/nginx/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr /bin
alan@workstation:~$ which nginx
/home/alan/web/prod/nginx/sbin/nginx
alan@workstation:~$ nginx -v
nginx-Version:nginx/1.14.0
Einen Prozess am Laufen halten
NOHUP
Ein Prozess wird möglicherweise nicht weiter ausgeführt, wenn Sie sich abmelden oder Ihr Terminal schließen. Dieser Sonderfall kann vermieden werden, indem Sie dem Befehl, den Sie ausführen möchten, den Befehl nohup voranstellen. Wenn Sie außerdem ein kaufmännisches Und (&) anhängen, wird der Prozess in den Hintergrund verschoben und Sie können das Terminal weiterhin verwenden. Angenommen, Sie möchten myprogram.sh.
ausführennohup myprogram.sh &
Eine nette Sache, die nohup macht, ist die PID des laufenden Prozesses zurückzugeben. Ich werde als nächstes mehr über die PID sprechen.
Einen laufenden Prozess verwalten
Das Linux-Terminal
- Die 7 besten Terminalemulatoren für Linux
- 10 Befehlszeilentools für die Datenanalyse unter Linux
- Jetzt herunterladen:SSH-Spickzettel
- Spickzettel für fortgeschrittene Linux-Befehle
- Linux-Befehlszeilen-Tutorials
Jeder Prozess erhält eine eindeutige Prozessidentifikationsnummer (PID). Diese Nummer verwenden wir, um jeden Prozess zu verwalten. Wir können auch den Prozessnamen verwenden, wie ich unten zeigen werde. Es gibt mehrere Befehle, die den Status eines laufenden Prozesses überprüfen können. Werfen wir einen kurzen Blick auf diese.
PS
Die häufigste ist PS. Die Standardausgabe von ps ist eine einfache Liste der Prozesse, die in Ihrem aktuellen Terminal ausgeführt werden. Wie Sie unten sehen können, enthält die erste Spalte die PID.
alan@workstation:~$ ps
PID TTY TIME CMD
23989 pts/0 00:00:00 bash
24148 pts/0 00:00:00 ps
Ich möchte den zuvor gestarteten Nginx-Prozess anzeigen. Dazu sage ich ps, dass es mir jeden laufenden Prozess zeigen soll (-e ) und eine vollständige Auflistung (-f ).
alan@workstation:~$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Aug18 ? 00:00:10 /sbin/init splash
root 2 0 0 Aug18 ? 00:00:00 [kthreadd]
root 4 2 0 Aug18 ? 00:00:00 [kworker/0:0H]
root 6 2 0 Aug18 ? 00:00:00 [mm_percpu_wq]
root 7 2 0 Aug18 ? 00:00:00 [ksoftirqd/0]
root 8 2 0 Aug18 ? 00:00:20 [rcu_sched]
root 9 2 0 Aug18 ? 00:00:00 [rcu_bh]
root 10 2 0 Aug18 ? 00:00:00 [migration/0]
root 11 2 0 Aug18 ? 00:00:00 [watchdog/0]
root 12 2 0 Aug18 ? 00:00:00 [cpuhp/0]
root 13 2 0 Aug18 ? 00:00:00 [cpuhp/1]
root 14 2 0 Aug18 ? 00:00:00 [watchdog/1]
root 15 2 0 Aug18 ? 00:00:00 [migration/1]
root 16 2 0 Aug18 ? 00:00:00 [ksoftirqd/1]
alan 20506 20496 0 10:39 pts/0 00:00:00 bash
alan 20520 1454 0 10:39 ? 00:00:00 nginx:Meisterprozess nginx
alan 20521 20520 0 10:39 ? 00:00:00 nginx:worker process
alan 20526 20506 0 10:39 pts/0 00:00:00 man ps
alan 20536 20526 0 10:39 pts/0 00:00:00 Pager
alan 20564 20496 0 10:40 pts/1 00:00:00 bash
Sie können die Nginx-Prozesse in der Ausgabe des obigen Befehls ps sehen. Der Befehl zeigte fast 300 Zeilen an, aber ich habe ihn für diese Illustration gekürzt. Wie Sie sich vorstellen können, ist der Versuch, 300 Zeilen an Prozessinformationen zu verarbeiten, etwas chaotisch. Wir können diese Ausgabe an grep weiterleiten, um nginx herauszufiltern.
alan@workstation:~$ ps -ef |grep nginx
alan 20520 1454 0 10:39 ? 00:00:00 nginx:Meisterprozess nginx
alan 20521 20520 0 10:39 ? 00:00:00 nginx:Arbeitsprozess
Das ist besser. Wir können schnell erkennen, dass Nginx die PIDs 20520 und 20521 hat.
PGREP
Der pgrep-Befehl wurde erstellt, um die Dinge weiter zu vereinfachen, indem die Notwendigkeit entfällt, grep separat aufzurufen.
alan@workstation:~$ pgrep nginx
20520
20521
Angenommen, Sie befinden sich in einer Hosting-Umgebung, in der mehrere Benutzer mehrere verschiedene Instanzen von Nginx ausführen. Mit -u können Sie andere von der Ausgabe ausschließen Option.
alan@workstation:~$ pgrep -u alan nginx
20520
20521
PIDOF
Ein weiteres nettes ist pidof. Dieser Befehl überprüft die PID einer bestimmten Binärdatei, selbst wenn ein anderer Prozess mit demselben Namen ausgeführt wird. Um ein Beispiel aufzusetzen, habe ich mein Nginx in ein zweites Verzeichnis kopiert und mit dem entsprechend gesetzten Präfix gestartet. Im wirklichen Leben könnte sich diese Instanz an einem anderen Ort befinden, z. B. in einem Verzeichnis, das einem anderen Benutzer gehört. Wenn ich beide Nginx-Instanzen ausführe, wird die ps -ef Ausgabe zeigt alle ihre Prozesse.
alan@workstation:~$ ps -ef |grep nginx
alan 20881 1454 0 11:18 ? 00:00:00 nginx:master process ./nginx -p /home/alan/web/prod/nginxsec
alan 20882 20881 0 11:18 ? 00:00:00 nginx:worker process
alan 20895 1454 0 11:19 ? 00:00:00 nginx:Meisterprozess nginx
alan 20896 20895 0 11:19 ? 00:00:00 nginx:Arbeitsprozess
Die Verwendung von grep oder pgrep zeigt PID-Nummern, aber wir können möglicherweise nicht erkennen, welche Instanz welche ist.
alan@workstation:~$ pgrep nginx
20881
20882
20895
20896
Der Befehl pidof kann verwendet werden, um die PID jeder spezifischen Nginx-Instanz zu ermitteln.
alan@workstation:~$ pidof /home/alan/web/prod/nginxsec/sbin/nginx
20882 20881
alan@workstation:~$ pidof /home/alan/ web/prod/nginx/sbin/nginx
20896 20895
TOP
Der top-Befehl gibt es schon seit langem und ist sehr nützlich, um Details laufender Prozesse anzuzeigen und Probleme wie Speicherfresser schnell zu identifizieren. Die Standardansicht ist unten dargestellt.
top - 11:56:28 up 1 Tag, 13:37, 1 Nutzer, Auslastungsdurchschnitt:0,09, 0,04, 0,03.qd/
Aufgaben:292 insgesamt, 3 laufen, 225 schlafen, 0 angehalten, 0 Zombie
%CPU(s): 0,1 us, 0,2 sy, 0,0 ni, 99,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st /cache
KiB-Swap: 0 insgesamt, 0 kostenlos, 0 verwendet. 14176540 Hilzem MEM
PID User PR Ni Virt RES Shr S% CPU% MEM TIME + Befehl
17270 ALAN 20 0 3930764 247288 98992 R 0,7 1,5 5:58.22 GNOME-SHALL
20496 Alan 20 0 816144 45416 29844 S 0,5 0,3 0:22.16 Gnome-Terminal-
21110 Alan 20 0 41940 3988 3188 R 0,1 0,0 0:00.17 oben
1 Wurzel 20 0 225564 9416 6768 s 0,0 0,1 0:10.72 Systemd
2 Wurzel 20 0 0 0 0 S 0,0 0.0 0:00.01 kthreadd
4 root 0 -20 0 0 0 i 0.0 0.0 0:00.00 Kworker / 0:0h
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
7 root 20 0 0 0 0 S 0.0 0.0 0:00.08 k
Das Aktualisierungsintervall kann durch Eingabe des Buchstabens s geändert werden gefolgt von der Anzahl der Sekunden, die Sie für Updates bevorzugen. Um die Überwachung unserer beispielhaften Nginx-Prozesse zu vereinfachen, können wir top aufrufen und die PID(s) mit -p übergeben Möglichkeit. Diese Ausgabe ist viel sauberer.
alan@workstation:~$ top -p20881 -p20882 -p20895 -p20896
Aufgaben: 4 insgesamt, 0 ausgeführt, 4 schlafend, 0 angehalten, 0 Zombie
%Cpu(s ):2.8 us, 1.3 sy, 0.0 ni, 95.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB-Speicher:16387132 insgesamt, 10856008 kostenlos, 1857648 verwendet, 3673476 Buff/Cache
KicheB Tauschen: 0 insgesamt, 0 kostenlos, 0 verwendet. 14177928 AvIAL MEM
PID User PR Ni Virt RES SHR S% CPU% MEM TIME + Befehl
20881 Alan 20 0 12016 348 0 S 0,0 0,0 0:00.00 Nginx
20882 Alan 20 0 12460 1644 932 S 0,0 0.0 0:00.00 Nginx
20895 Alan 20 0 12016 352 0 S 0,0 0.0 0:00.00 Nginx
20896 Alan 20 0 12460 1628 912 S 0,0 0,0 0:00.00 NginxEs ist wichtig, die PID beim Verwalten von Prozessen, insbesondere beim Stoppen, korrekt zu bestimmen. Wenn Sie top auf diese Weise verwenden, muss top jedes Mal, wenn einer dieser Prozesse gestoppt oder ein neuer gestartet wird, über die neuen informiert werden.
Stoppen eines Prozesses
TÖTEN
Interessanterweise gibt es keinen Stoppbefehl. Unter Linux gibt es den Kill-Befehl. Kill wird verwendet, um ein Signal an einen Prozess zu senden. Das am häufigsten verwendete Signal ist „terminate“ (SIGTERM) oder „kill“ (SIGKILL). Es gibt jedoch noch viele mehr. Nachfolgend finden Sie einige Beispiele. Die vollständige Liste kann mit kill -L angezeigt werden .
1) Sighup 2) Sigint 3) Sigquit 4) Sigill 5) SigTRAP
6) Sigabrt 7) Sigbus 8) Sigfpe 9) Sigkill 10) Sigusr1
11) SIGSGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERMBeachten Sie, dass Signal Nummer neun SIGKILL ist. Normalerweise geben wir einen Befehl wie kill -9 20896 aus . Das Standardsignal ist 15, was SIGTERM ist. Denken Sie daran, dass viele Anwendungen ihre eigene Methode zum Stoppen haben. Nginx verwendet ein -s Option zum Übergeben eines Signals wie „Stopp“ oder „Nachladen“. Im Allgemeinen ziehe ich es vor, die spezifische Methode einer Anwendung zu verwenden, um eine Operation zu stoppen. Ich werde jedoch den kill-Befehl demonstrieren, um den Nginx-Prozess 20896 zu stoppen, und dann mit pgrep bestätigen, dass er gestoppt wurde. Die PID 20896 erscheint nicht mehr.
alan@workstation:~$ kill -9 20896
alan@workstation:~$ pgrep nginx
20881
20882
20895
22123PKILL
Der Befehl pkill ähnelt pgrep darin, dass er nach Namen suchen kann. Dies bedeutet, dass Sie bei der Verwendung von pkill sehr vorsichtig sein müssen. In meinem Beispiel mit Nginx entscheide ich mich möglicherweise nicht dafür, es zu verwenden, wenn ich nur eine Nginx-Instanz beenden möchte. Ich kann die Nginx-Option -s übergeben Stopp zu einer bestimmten Instanz, um es zu beenden, oder ich muss grep verwenden, um nach der vollständigen ps-Ausgabe zu filtern.
/home/alan/web/prod/nginx/sbin/nginx -s stop
/home/alan/web/prod/nginxsec/sbin/nginx -s stopWenn ich pkill verwenden möchte, kann ich das -f einfügen Option, um pkill aufzufordern, über das vollständige Befehlszeilenargument zu filtern. Dies gilt natürlich auch für pgrep. Also kann ich zuerst mit pgrep -a nachsehen bevor Sie pkill -f ausgeben .
alan@workstation:~$ pgrep -a nginx
20881 nginx:Hauptprozess ./nginx -p /home/alan/web/prod/nginxsec
20882 nginx:Arbeitsprozess
20895 nginx:Masterprozess nginx
20896 nginx:ArbeitsprozessIch kann mein Ergebnis auch mit pgrep -f eingrenzen . Das gleiche Argument, das mit pkill verwendet wird, stoppt den Prozess.
alan@workstation:~$ pgrep -f nginxsec
20881
alan@workstation:~$ pkill -f nginxsecDas Wichtigste, woran Sie bei pgrep (und insbesondere pkill) denken sollten, ist, dass Sie sich immer sicher sein müssen dass Ihr Suchergebnis korrekt ist, sodass Sie nicht unbeabsichtigt die falschen Prozesse beeinflussen.
Die meisten dieser Befehle haben viele Befehlszeilenoptionen, daher empfehle ich immer, die Manpage zu jedem einzelnen zu lesen. Während die meisten davon auf Plattformen wie Linux, Solaris und BSD existieren, gibt es einige Unterschiede. Testen Sie immer und seien Sie bereit, bei Bedarf Korrekturen vorzunehmen, wenn Sie an der Befehlszeile arbeiten oder Skripts schreiben.