Zoeken…


Lijst met huidige taken

$ 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 &

Taakafhandeling

Banen creëren

Voeg een opdracht toe door een & toe te voegen na de opdracht:

$ sleep 10 &
[1] 20024

U kunt ook een lopend proces tot een taak maken door op Ctrl + z te drukken:

$ sleep 10
^Z
[1]+  Stopped                 sleep 10

Achtergrond en voorgrond een proces

Om het proces naar de voorgrond te brengen, wordt het commando fg gebruikt samen met %

$ sleep 10 &
[1] 20024

$ fg %1
sleep 10

Nu kunt u communiceren met het proces. Om het terug naar de achtergrond te brengen, kunt u de opdracht bg gebruiken. Vanwege de bezette terminalsessie moet u het proces eerst stoppen door op Ctrl + z te drukken.

$ sleep 10
^Z
[1]+  Stopped              sleep 10

$ bg %1
[1]+ sleep 10 &

Vanwege de luiheid van sommige programmeurs werken al deze opdrachten ook met één % als er slechts één proces is, of voor het eerste proces in de lijst. Bijvoorbeeld:

$ sleep 10 &
[1] 20024

$ fg %        # to bring a process to foreground 'fg %' is also working.
sleep 10

of gewoon

$ %           # laziness knows no boundaries, '%' is also working.
sleep 10

Bovendien, gewoon fg of bg typen zonder argument behandelt de laatste taak:

$ sleep 20 &
$ sleep 10 &
$ fg
sleep 10
^C
$ fg
sleep 20

Lopende taken doden

$ sleep 10 &
[1] 20024

$ kill %1
[1]+  Terminated              sleep 10

Het slaapproces wordt op de achtergrond uitgevoerd met proces-ID (pid) 20024 en 20024 1 . Om naar het proces te verwijzen, kunt u het pid- of het jobnummer gebruiken. Als u het taaknummer gebruikt, moet u dit voorafgaan door % . Het standaard kill-signaal verzonden door kill is SIGTERM , waardoor het SIGTERM kan worden SIGTERM .

Enkele veel voorkomende kill-signalen worden hieronder getoond. Voer kill -l om een volledige lijst te zien.

Signaalnaam Signaalwaarde Effect
SIGHUP 1 Ophangen
SIGINT 2 Onderbreken van toetsenbord
SIGKILL 9 Dood signaal
SIGTERM 15 Beëindigingssignaal

Start en dood specifieke processen

Waarschijnlijk is de eenvoudigste manier om een lopend proces te doden door het via de pkill selecteren, zoals in het volgende voorbeeld, met de opdracht pkill als

pkill -f test.py

(of) een meer onfeilbare manier om pgrep te gebruiken pgrep te zoeken naar de werkelijke proces-id

kill $(pgrep -f 'python test.py')

Hetzelfde resultaat kan worden verkregen met grep over ps -ef | grep name_of_process en doodt vervolgens het proces dat is gekoppeld aan de resulterende pid (proces-id). Het selecteren van een proces met de naam ervan is handig in een testomgeving, maar kan erg gevaarlijk zijn wanneer het script in productie wordt gebruikt: het is vrijwel onmogelijk om er zeker van te zijn dat de naam overeenkomt met het proces dat u daadwerkelijk wilt doden. In die gevallen is de volgende aanpak eigenlijk veel veilig.

Start het script dat uiteindelijk wordt gedood met de volgende aanpak. Laten we aannemen dat het commando dat u wilt uitvoeren en uiteindelijk wilt doden, 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

Hiermee wordt een bestand gemaakt in de map /tmp met de pid van het python test.py proces. Als het bestand al bestaat, nemen we aan dat de opdracht al actief is en dat het script een fout retourneert.

Gebruik vervolgens het volgende script als je het wilt doden:

#!/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

die het proces dat aan uw opdracht is gekoppeld, zal doden, zonder te vertrouwen op vluchtige informatie (zoals de tekenreeks die wordt gebruikt om de opdracht uit te voeren). Zelfs in dit geval als het bestand niet bestaat, gaat het script ervan uit dat u een niet-actief proces wilt doden.

Dit laatste voorbeeld kan eenvoudig worden verbeterd door dezelfde opdracht meerdere keren uit te voeren (bijvoorbeeld toevoegen aan het pid-bestand in plaats van het te overschrijven) en om gevallen te beheren waarin het proces sterft voordat het wordt gedood.

Maak een lijst van alle processen

Er zijn twee veel voorkomende manieren om alle processen op een systeem weer te geven. Beide vermelden alle processen die door alle gebruikers worden uitgevoerd, hoewel ze verschillen in het formaat dat ze uitvoeren (de reden voor de verschillen is historisch).

ps -ef   # lists all processes 
ps aux   # lists all processes in alternative format (BSD)

Dit kan worden gebruikt om te controleren of een bepaalde toepassing actief is. Om bijvoorbeeld te controleren of de SSH-server (sshd) actief is:

ps -ef | grep sshd

Controleer welk proces op een specifieke poort wordt uitgevoerd

Controleren welk proces op poort 8080 wordt uitgevoerd

lsof -i :8080

Informatie zoeken over een lopend proces

ps aux | grep <search-term> toont processen die overeenkomen met de zoekterm

Voorbeeld:

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 is de tweede kolom het proces-ID. Als u bijvoorbeeld het nginx-proces wilt doden, kunt u de opdracht kill 5647 . Het is altijd raadzaam om het kill commando te gebruiken met SIGTERM plaats van SIGKILL .

Achtergrondtaak verwerpen

$ gzip extremelylargefile.txt &
$ bg
$ disown %1

Hierdoor kan een langlopend proces doorgaan zodra uw shell (terminal, ssh, enz.) Is gesloten.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow