Bash
Jobs und Prozesse
Suche…
Aktuelle Jobs auflisten
$ tail -f /var/log/syslog > log.txt
[1]+ Stopped tail -f /var/log/syslog > log.txt
$ sleep 10 &
$ jobs
[1]+ Stopped tail -f /var/log/syslog > log.txt
[2]- Running sleep 10 &
Auftragsabwicklung
Arbeitsplätze schaffen
Um einen Job zu erstellen, hängen Sie einfach ein einzelnes &
nach dem Befehl an:
$ sleep 10 &
[1] 20024
Sie können einen laufenden Prozess auch zu einem Job machen, indem Sie Strg + z drücken:
$ sleep 10
^Z
[1]+ Stopped sleep 10
Hintergrund und Vordergrund eines Prozesses
Um den Prozess in den Vordergrund zu bringen, wird der Befehl fg
zusammen mit %
$ sleep 10 &
[1] 20024
$ fg %1
sleep 10
Jetzt können Sie mit dem Prozess interagieren. Um es in den Hintergrund zu bringen, können Sie den Befehl bg
. Aufgrund der belegten Terminalsitzung müssen Sie den Vorgang zuerst durch Drücken von Strg + z beenden.
$ sleep 10
^Z
[1]+ Stopped sleep 10
$ bg %1
[1]+ sleep 10 &
Aufgrund der Faulheit einiger Programmierer funktionieren alle diese Befehle auch mit einem einzelnen %
wenn nur ein Prozess oder für den ersten Prozess in der Liste vorhanden ist. Zum Beispiel:
$ sleep 10 &
[1] 20024
$ fg % # to bring a process to foreground 'fg %' is also working.
sleep 10
oder nur
$ % # laziness knows no boundaries, '%' is also working.
sleep 10
Wenn Sie einfach fg
oder bg
ohne Argument eingeben, wird der letzte Job erledigt:
$ sleep 20 &
$ sleep 10 &
$ fg
sleep 10
^C
$ fg
sleep 20
Laufende Jobs töten
$ sleep 10 &
[1] 20024
$ kill %1
[1]+ Terminated sleep 10
Der Sleep-Prozess wird im Hintergrund mit der Prozess-ID (PID) 20024
und der 20024
1
. Um auf den Prozess zu verweisen, können Sie entweder die PID oder die Auftragsnummer verwenden. Wenn Sie die Auftragsnummer verwenden, müssen Sie %
mit einem Präfix versehen. Das Standard - Kill - Signal gesendet durch kill
ist SIGTERM
, die der Zielprozess ordnungsgemäß beenden kann.
Einige übliche Kill-Signale werden unten gezeigt. Um eine vollständige Liste kill -l
, führen Sie kill -l
.
Signalname | Signalwert | Bewirken |
---|---|---|
SIGHUP | 1 | Auflegen |
SIGINT | 2 | Unterbrechen Sie von der Tastatur |
SIGKILL | 9 | Signal töten |
SIGTERM | 15 | Beendigungssignal |
Bestimmte Prozesse starten und beenden
Die einfachste Möglichkeit, einen laufenden Prozess zu pkill
, ist wahrscheinlich die Auswahl des Prozessnamens wie im folgenden Beispiel mit pkill
Befehl pkill
as
pkill -f test.py
(oder) eine pgrep
Methode, mit pgrep
nach der tatsächlichen Prozess-ID zu suchen
kill $(pgrep -f 'python test.py')
Dasselbe Ergebnis kann mit grep
über ps -ef | grep name_of_process
dann den Prozess, der der resultierenden pid (Prozess-ID) zugeordnet ist. Die Auswahl eines Prozesses anhand seines Namens ist in einer Testumgebung praktisch, kann jedoch bei der Verwendung des Skripts in der Produktion sehr gefährlich sein: Es ist praktisch unmöglich, sicher zu gehen, dass der Name dem Prozess entspricht, den Sie tatsächlich beenden möchten. In diesen Fällen ist der folgende Ansatz tatsächlich sehr sicher.
Starten Sie das Skript, das schließlich mit der folgenden Vorgehensweise beendet wird. Nehmen wir an, der Befehl, den Sie ausführen und schließlich python test.py
möchten, ist python test.py
#!/bin/bash
if [[ ! -e /tmp/test.py.pid ]]; then # Check if the file already exists
python test.py & #+and if so do not run another process.
echo $! > /tmp/test.py.pid
else
echo -n "ERROR: The process is already running with pid "
cat /tmp/test.py.pid
echo
fi
Dadurch wird eine Datei im Verzeichnis /tmp
, die die python test.py
Prozesses python test.py
. Wenn die Datei bereits vorhanden ist, gehen wir davon aus, dass der Befehl bereits ausgeführt wird und das Skript einen Fehler zurückgibt.
Wenn Sie es beenden möchten, verwenden Sie das folgende Skript:
#!/bin/bash
if [[ -e /tmp/test.py.pid ]]; then # If the file do not exists, then the
kill `cat /tmp/test.py.pid` #+the process is not running. Useless
rm /tmp/test.py.pid #+trying to kill it.
else
echo "test.py is not running"
fi
Dadurch wird genau der Prozess abgebrochen, der Ihrem Befehl zugeordnet ist, ohne sich auf flüchtige Informationen zu verlassen (wie zum Beispiel die Zeichenfolge, die zur Ausführung des Befehls verwendet wird). Wenn die Datei nicht vorhanden ist, geht das Skript davon aus, dass Sie einen nicht laufenden Prozess beenden möchten.
Dieses letzte Beispiel kann leicht verbessert werden, wenn derselbe Befehl mehrmals ausgeführt wird (z. B. durch Anhängen an die PID-Datei, anstatt sie zu überschreiben) und um Fälle zu verwalten, in denen der Prozess abbricht, bevor er beendet wird.
Alle Prozesse auflisten
Es gibt zwei Möglichkeiten, alle Prozesse auf einem System aufzulisten. In beiden sind alle Prozesse aufgeführt, die von allen Benutzern ausgeführt werden, obwohl sie sich im Format unterscheiden, das sie ausgeben (der Grund für die Unterschiede ist historisch).
ps -ef # lists all processes
ps aux # lists all processes in alternative format (BSD)
Dies kann verwendet werden, um zu überprüfen, ob eine bestimmte Anwendung ausgeführt wird. So prüfen Sie beispielsweise, ob der SSH-Server (sshd) ausgeführt wird:
ps -ef | grep sshd
Prüfen Sie, welcher Prozess an einem bestimmten Port ausgeführt wird
So prüfen Sie, welcher Prozess auf Port 8080 ausgeführt wird
lsof -i :8080
Informationen zu einem laufenden Prozess suchen
ps aux | grep <search-term>
zeigt Prozesse, die dem Suchbegriff entsprechen
Beispiel:
root@server7:~# ps aux | grep nginx
root 315 0.0 0.3 144392 1020 ? Ss May28 0:00 nginx: master process /usr/sbin/nginx
www-data 5647 0.0 1.1 145124 3048 ? S Jul18 2:53 nginx: worker process
www-data 5648 0.0 0.1 144392 376 ? S Jul18 0:00 nginx: cache manager process
root 13134 0.0 0.3 4960 920 pts/0 S+ 14:33 0:00 grep --color=auto nginx
root@server7:~#
Hier ist die zweite Spalte die Prozess-ID. Wenn Sie beispielsweise den Nginx-Prozess beenden möchten, können Sie den Befehl kill 5647
. Es wird immer empfohlen, den Befehl kill
mit SIGTERM
anstelle von SIGKILL
.
Verweigern des Hintergrundjobs
$ gzip extremelylargefile.txt &
$ bg
$ disown %1
Dadurch kann ein lang andauernder Prozess fortgesetzt werden, sobald Ihre Shell (Terminal, SSH usw.) geschlossen wird.