Bash
Jobb och processer
Sök…
Lista aktuella jobb
$ 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 &
Jobbhantering
Skapa jobb
För att skapa ett jobb, lägg bara till en enda &
efter kommandot:
$ sleep 10 &
[1] 20024
Du kan också göra en körprocess till ett jobb genom att trycka på Ctrl + z :
$ sleep 10
^Z
[1]+ Stopped sleep 10
Bakgrund och förgrund en process
För att föra processen till förgrunden används kommandot fg
tillsammans med %
$ sleep 10 &
[1] 20024
$ fg %1
sleep 10
Nu kan du interagera med processen. För att föra tillbaka det till bakgrunden kan du använda kommandot bg
. På grund av den ockuperade terminalsessionen måste du stoppa processen först genom att trycka på Ctrl + z .
$ sleep 10
^Z
[1]+ Stopped sleep 10
$ bg %1
[1]+ sleep 10 &
På grund av latheten hos vissa programmerare fungerar alla dessa kommandon också med en enda %
om det bara finns en process, eller för den första processen i listan. Till exempel:
$ sleep 10 &
[1] 20024
$ fg % # to bring a process to foreground 'fg %' is also working.
sleep 10
eller bara
$ % # laziness knows no boundaries, '%' is also working.
sleep 10
Dessutom är det bara att skriva fg
eller bg
utan några argument som hanterar det sista jobbet:
$ sleep 20 &
$ sleep 10 &
$ fg
sleep 10
^C
$ fg
sleep 20
Döda kör jobb
$ sleep 10 &
[1] 20024
$ kill %1
[1]+ Terminated sleep 10
Sovprocessen körs i bakgrunden med process-id (pid) 20024
och jobb nummer 1
. För att referera till processen kan du använda antingen pid eller jobbnumret. Om du använder jobbnumret måste du prefixa det med %
. Standarddödssignalen som skickas av kill
är SIGTERM
, som tillåter SIGTERM
att gå ut graciöst.
Några vanliga dödsignaler visas nedan. kill -l
att se en fullständig lista.
Signalnamn | Signalvärde | Effekt |
---|---|---|
SIGHUP | 1 | Lägg på |
SIGINT | 2 | Avbryt från tangentbordet |
SIGKILL | 9 | Dödsignal |
SIGTERM | 15 | Avslutande signal |
Starta och döda specifika processer
Förmodligen är det enklaste sättet att döda en körningsprocess genom att välja den genom processnamnet som i följande exempel med pkill
kommando som
pkill -f test.py
(eller) ett mer pgrep
sätt med pgrep
att söka efter det faktiska process-id
kill $(pgrep -f 'python test.py')
Samma resultat kan erhållas med hjälp av grep
över ps -ef | grep name_of_process
och döda sedan processen associerad med den resulterande pid (process-id). Att välja en process med sitt namn är övertygande i en testmiljö men kan vara riktigt farligt när manuset används i produktionen: det är praktiskt taget omöjligt att vara säker på att namnet kommer att matcha den process du faktiskt vill döda. I dessa fall är följande tillvägagångssätt faktiskt mycket säkert.
Starta skriptet som så småningom kommer att dödas med följande tillvägagångssätt. Låt oss anta att kommandot du vill köra och så småningom döda är 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
Detta skapar en fil i /tmp
katalogen som innehåller pid för processen python test.py
Om filen redan finns antar vi att kommandot redan körs och skriptet returnerar ett fel.
När du vill döda det använder du följande 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
som dödar exakt processen som är associerad med ditt kommando, utan att förlita sig på någon flyktig information (som strängen som används för att köra kommandot). Även i det här fallet om filen inte finns antar skriptet att du vill döda en process som inte körs.
Detta sista exempel kan lätt förbättras för att köra samma kommando flera gånger (lägg till pid-filen istället för att skriva över den till exempel) och för att hantera fall där processen dör innan den dödas.
Lista alla processer
Det finns två vanliga sätt att lista alla processer i ett system. Båda listar alla processer som körs av alla användare, även om de skiljer sig i formatet de matar ut (orsaken till skillnaderna är historiska).
ps -ef # lists all processes
ps aux # lists all processes in alternative format (BSD)
Detta kan användas för att kontrollera om en given applikation körs. För att till exempel kontrollera om SSH-servern (sshd) körs:
ps -ef | grep sshd
Kontrollera vilken process som körs på en specifik port
För att kontrollera vilken process som körs på port 8080
lsof -i :8080
Hitta information om en löpande process
ps aux | grep <search-term>
visar processer som matchar söktermen
Exempel:
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:~#
Här är den andra kolumnen process-id. Om du till exempel vill döda nginx-processen kan du använda kommandot kill 5647
. Det rekommenderas alltid att använda kill
kommandot med SIGTERM
snarare än SIGKILL
.
Avvisar bakgrundsjobb
$ gzip extremelylargefile.txt &
$ bg
$ disown %1
Detta tillåter en lång igång process att fortsätta när ditt skal (terminal, ssh, etc) är stängt.