Bash
Jobs en processen
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.