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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow