Hur man kör och kontrollerar bakgrundsprocesser på Linux

Använd Bash-skalet i Linux för att hantera förgrunds- och bakgrundsprocesser. Du kan använda Bashs jobbkontrollfunktioner och signaler för att ge dig mer flexibilitet i hur du kör kommandon. Vi visar dig hur.

Allt om processer

Närhelst ett program körs i ett Linux- eller Unix-liknande operativsystem startas en process. ”Process” är namnet på den interna representationen av det körande programmet i datorns minne. Det finns en process för varje aktivt program. Faktum är att det finns en process för nästan allt som körs på din dator. Det inkluderar komponenterna i din grafisk skrivbordsmiljö (GDE) som t.ex GNOME eller KDEoch system demoner som lanseras vid uppstart.

Varför nästan allt som är igång? Jo, Bash inbyggda som t.ex CD, pwdoch alias behöver inte ha en process lanserad (eller ”spawned”) när de körs. Bash kör dessa kommandon inom instansen av Bash-skalet som körs i ditt terminalfönster. Dessa kommandon är snabba just för att de inte behöver ha en process startad för att de ska kunna utföras. (Du kan skriva hjälp i ett terminalfönster för att se listan över inbyggda Bash-program.)

Processer kan köras i förgrunden, i vilket fall de tar över din terminal tills de har slutförts, eller så kan de köras i bakgrunden. Processer som körs i bakgrunden dominerar inte terminalfönstret och du kan fortsätta att arbeta i det. Eller åtminstone dominerar de inte terminalfönstret om de inte genererar skärmutdata.

Ett rörigt exempel

Vi startar en enkel ping spår löpning. Vi kommer att pinga How-To Geek-domänen. Detta kommer att utföras som en förgrundsprocess.

ping www.wdzwdz.com

Vi får de förväntade resultaten genom att rulla ner i terminalfönstret. Vi kan inte göra något annat i terminalfönstret medan ping körs. För att avsluta kommandot tryck Ctrl+C.

Ctrl+C

Den synliga effekten av Ctrl+C är markerad i skärmdumpen. ping ger en kort sammanfattning och slutar sedan.

Låt oss upprepa det. Men den här gången trycker vi på Ctrl+Z istället för Ctrl+C. Uppgiften kommer inte att avslutas. Det blir en bakgrundsuppgift. Vi får tillbaka kontrollen över terminalfönstret till oss.

ping www.wdzwdz.com
Ctrl+Z

Den synliga effekten av att trycka på Ctrl+Z är markerad i skärmdumpen.

Den här gången får vi veta att processen har stoppats. Stoppad betyder inte avslutad. Det är som en bil vid en stoppskylt. Vi har inte skrotat det och slängt det. Den är fortfarande på vägen, stillastående och väntar på att gå. Processen är nu ett bakgrundsjobb.

Jobbens kommando kommer att lista jobben som har startats i den aktuella terminalsessionen. Och eftersom jobb (oundvikligen) är processer kan vi också använda kommandot ps för att se dem. Låt oss använda båda kommandona och jämföra deras utdata. Vi använder alternativet T-alternativet (terminal) för att bara lista de processer som körs i detta terminalfönster. Observera att det inte finns något behov av att använda ett bindestreck – med alternativet T.

jobs
ps T

Kommandot jobb säger till oss:

[1]: Siffran inom hakparentes är jobbnumret. Vi kan använda detta för att referera till jobbet när vi behöver styra det med jobbkontrollkommandon.
+: Plustecknet + visar att detta är jobbet som kommer att åtgärdas om vi använder ett jobbkontrollkommando utan ett specifikt jobbnummer. Det kallas standardjobbet. Standardjobbet är alltid det som senast lagts till i listan över jobb.
Stoppad: Processen körs inte.
ping www.wdzwdz.com: Kommandoraden som startade processen.

Kommandot ps säger till oss:

PID: Processens process-ID. Varje process har ett unikt ID.
TTY: Pseudo-teletypen (terminalfönster) som processen kördes från.
STAT: Status för processen.
TID: Mängden CPU-tid som förbrukas av processen.
COMMAND: Kommandot som startade processen.

Dessa är vanliga värden för STAT-kolumnen:

D: Oavbruten sömn. Processen är i ett vänteläge, vanligtvis väntar på inmatning eller utdata, och kan inte avbrytas.
Jag: Inaktiv.
R: Springer.
S: Avbrytbar sömn.
T: Stoppas av en jobbkontrollsignal.
Z: En zombieprocess. Processen har avslutats men har inte ”rensats ner” av sin överordnade process.

Värdet i STAT-kolumnen kan följas av en av dessa extra indikatorer:

<: high-priority="" task="" nice="" to="" other="" processes="" n:="" low-priority="" l:="" process="" has="" pages="" locked="" into="" memory="" used="" by="" real-time="" s:="" a="" session="" leader.="" leader="" is="" that="" launched="" groups.="" shell="" multi-thread="" process.="" foreground="">Vi kan se att Bash har ett tillstånd av Ss. Det stora ”S” talar om för oss att Bash-skalet sover och att det är avbrytbart. Så fort vi behöver det kommer det att svara. Det gemena ”s” talar om för oss att skalet är en sessionsledare.

Ping-kommandot har tillståndet T. Detta talar om för oss att ping har stoppats av en jobbkontrollsignal. I det här exemplet var det Ctrl+Z vi använde för att sätta den i bakgrunden.

Kommandot ps T har tillståndet R, vilket står för körning. + anger att denna process är en medlem av förgrundsgruppen. Så kommandot ps T körs i förgrunden.

bg-kommandot

Kommandot bg används för att återuppta en bakgrundsprocess. Den kan användas med eller utan jobbnummer. Om du använder det utan ett jobbnummer förs standardjobbet i förgrunden. Processen körs fortfarande i bakgrunden. Du kan inte skicka någon input till den.

Om vi ​​utfärdar bg-kommandot kommer vi att återuppta vårt ping-kommando:

bg

Ping-kommandot återupptas och vi ser rullningsutgången i terminalfönstret igen. Namnet på kommandot som har startats om visas för dig. Detta är markerat i skärmdumpen.

Men vi har ett problem. Uppgiften körs i bakgrunden och accepterar inte input. Så hur stoppar vi det? Ctrl+C gör ingenting. Vi kan se det när vi skriver det men bakgrundsuppgiften tar inte emot de tangenttryckningarna så den fortsätter att plinga glatt iväg.

Faktum är att vi nu är i ett konstigt blandat läge. Vi kan skriva i terminalfönstret men det vi skriver svepas snabbt bort av den rullande utmatningen från ping-kommandot. Allt vi skriver får effekt i förgrunden.

För att stoppa vår bakgrundsuppgift måste vi föra den i förgrunden och sedan stoppa den.

Kommandot fg

Kommandot fg kommer att ta en bakgrundsuppgift i förgrunden. Precis som kommandot bg kan det användas med eller utan jobbnummer. Att använda det med ett jobbnummer innebär att det kommer att fungera på ett specifikt jobb. Om den används utan jobbnummer används det senaste kommandot som skickades till bakgrunden.

Om vi ​​skriver fg kommer vårt ping-kommando att hamna i förgrunden. Tecknen vi skriver blandas ihop med utdata från ping-kommandot, men de hanteras av skalet som om de hade skrivits in på kommandoraden som vanligt. Och faktiskt, från Bash-skalets synvinkel, är det precis vad som har hänt.

fg

Och nu när vi har ping-kommandot igång i förgrunden igen, kan vi använda Ctrl+C för att döda det.

Ctrl+C

Vi måste skicka rätt signaler

Det var inte direkt snyggt. Uppenbarligen fungerar det bäst att köra en process i bakgrunden när processen inte producerar utdata och inte kräver input.

Men, rörigt eller inte, vårt exempel åstadkom:

Att sätta en process i bakgrunden.
Återställer processen till ett körläge i bakgrunden.
Återför processen till förgrunden.
Avsluta processen.

När du använder Ctrl+C och Ctrl+Z sänder du signaler till processen. Dessa är stenografiska sätt att använda kommandot kill. Det finns 64 olika signaler att döda kan skicka. Använd kill -l på kommandoraden för att lista dem. döda är inte den enda källan till dessa signaler. Vissa av dem höjs automatiskt av andra processer i systemet

Här är några av de vanligaste.

SIGHUP: Signal 1. Skickas automatiskt till en process när terminalen den körs i stängs.
SIGINT: Signal 2. Skickas till en process du trycker på Ctrl+C. Processen avbryts och uppmanas att avslutas.
SIGQUIT: Signal 3. Skickas till en process om användaren skickar en quit-signal Ctrl+D.
SIGKILL: Signal 9. Processen avbryts omedelbart och kommer inte att försöka stänga ner rent. Processen går inte graciöst ner.
SIGTERM: Signal 15. Detta är standardsignalen som skickas av kill. Det är standardsignalen för programavslutning.
SIGTSTP: Signal 20. Skickas till en process när du använder Ctrl+Z. Den stoppar processen och placerar den i bakgrunden.

Vi måste använda kommandot kill för att utfärda signaler som inte har tangentkombinationer tilldelade dem.

Ytterligare jobbkontroll

En process som flyttas till bakgrunden med Ctrl+Z placeras i stoppat läge. Vi måste använda kommandot bg för att starta det igen. Att starta ett program som en pågående bakgrundsprocess är enkelt. Lägg till ett et-tecken & i slutet av kommandoraden.

Även om det är bäst att bakgrundsprocesser inte skriver till terminalfönstret, kommer vi att använda exempel som gör det. Vi måste ha något i skärmdumparna som vi kan referera till. Detta kommando kommer att starta en oändlig loop som en bakgrundsprocess:

medan sant; gör echo ”How-To Geek Loop Process”; sömn 3; Gjort &

medan sant;  gör eko

Vi får veta jobbnumret och process-ID för processen. Vårt jobbnummer är 1 och process-id är 1979. Vi kan använda dessa identifierare för att styra processen.

Utdata från vår ändlösa loop börjar dyka upp i terminalfönstret. Som tidigare kan vi använda kommandoraden men alla kommandon vi utfärdar varvas med utdata från loopprocessen.

ls

För att stoppa vår process kan vi använda jobb för att påminna oss själva vad jobbnumret är och sedan använda kill.

jobs rapporterar att vår process är jobb nummer 1. För att använda det numret med kill måste vi föregå det med ett procenttecken %.

jobs
kill %1

kill skickar SIGTERM-signalen, signal nummer 15, till processen och den avslutas. När du trycker på Enter nästa gång visas en status för jobbet. Den listar processen som ”avbruten”. Om processen inte svarar på kill-kommandot kan du ta det upp ett snäpp. Använd kill med SIGKILL , signal nummer 9. Sätt bara siffran 9 mellan kill-kommandot och jobbnumret.

kill 9 %1

Saker vi har täckt

Ctrl+C: Skickar SIGINT, signal 2, till processen – om den accepterar inmatning – och säger åt den att avsluta.
Ctrl+D: Skickar SISQUIT, signal 3, till processen – om den accepterar inmatning – och säger åt den att avsluta.
Ctrl+Z: Skickar SIGSTP, signal 20, till processen och säger till den att stoppa (avbryta) och bli en bakgrundsprocess.
jobb: Listar bakgrundsjobben och visar deras jobbnummer.
bg job_number: Startar om en bakgrundsprocess. Om du inte anger ett jobbnummer används den senaste processen som förvandlades till en bakgrundsuppgift.
fg job_number: tar med en bakgrundsprocess i förgrunden och startar om den. Om du inte anger ett jobbnummer används den senaste processen som förvandlades till en bakgrundsuppgift.
kommandorad &: Om du lägger till ett et-tecken & i slutet av en kommandorad körs det kommandot som en bakgrundsuppgift, som körs.
kill %job_number: Skickar SIGTERM, signal 15, till processen för att avsluta den.
kill 9 %job_number: Skickar SIGKILL, signal 9, till processen och avslutar den abrupt.