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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow