Как да стартирате и контролирате фонови процеси в Linux

Използвайте обвивката на Bash в Linux, за да управлявате процеси на преден и заден план. Можете да използвате функциите и сигналите за контрол на заданията на Bash, за да ви даде повече гъвкавост в начина, по който изпълнявате команди. Ние ви показваме как.

Всичко за процесите

Всеки път, когато дадена програма се изпълнява в операционна система, подобна на Linux или Unix, се стартира процес. “Процес” е името на вътрешното представяне на изпълняващата се програма в паметта на компютъра. За всяка активна програма има процес. Всъщност има процес за почти всичко, което се изпълнява на вашия компютър. Това включва компонентите на вашия графична среда на работния плот (GDE) като напр GNOME или KDE, и система демони които се стартират при стартиране.

Защо почти всичко, което работи? Е, вградени в Bash като напр cd, Pwd, и псевдоним не е необходимо да стартират (или „зараждат“ процес), когато се изпълняват. Bash изпълнява тези команди в рамките на екземпляра на обвивката на Bash, която се изпълнява във вашия терминален прозорец. Тези команди са бързи именно защото не е необходимо да имат стартиран процес, за да ги изпълнят. (Можете да напишете help в прозорец на терминала, за да видите списъка с вградени Bash.)

Процесите могат да се изпълняват на преден план, като в този случай те поемат вашия терминал, докато не завършат, или могат да се изпълняват на заден план. Процесите, които се изпълняват във фонов режим, не доминират в прозореца на терминала и можете да продължите да работите в него. Или поне те не доминират в прозореца на терминала, ако не генерират изход на екрана.

Разхвърлян пример

Ще започнем обикновен пинг трасиране. Ще изпратим ping на домейна How-To Geek. Това ще се изпълни като процес на преден план.

ping www.wdzwdz.com

Получаваме очакваните резултати, превъртайки надолу прозореца на терминала. Не можем да правим нищо друго в прозореца на терминала, докато ping работи. За да прекратите командата, натиснете Ctrl+C.

Ctrl+C

Видимият ефект на Ctrl+C е подчертан на екранната снимка. ping дава кратко резюме и след това спира.

Нека повторим това. Но този път ще натиснем Ctrl+Z вместо Ctrl+C. Задачата няма да бъде прекратена. Това ще се превърне във фонова задача. Получаваме контрола върху прозореца на терминала, върнат ни.

ping www.wdzwdz.com
Ctrl+Z

Видимият ефект от натискането на Ctrl+Z е подчертан на екранната снимка.

Този път ни казват, че процесът е спрян. Спрян не означава прекратен. Това е като кола на знак за стоп. Не сме го бракували и изхвърлили. Все още е на пътя, неподвижно, чака да си тръгне. Процесът вече е фонова работа.

Командата за работни места ще изброи работните места които са стартирани в текущата терминална сесия. И тъй като заданията са (неизбежно) процеси, можем да използваме и командата ps, за да ги видим. Нека използваме и двете команди и да сравним техните резултати. Ще използваме опцията T (терминал), за да изброим само процесите, които се изпълняват в този терминален прозорец. Имайте предвид, че не е необходимо да използвате тире – с опцията T.

jobs
ps T

Командата jobs ни казва:

  Как да инсталирате темата Skeuos GTK на Linux

[1]: Числото в квадратни скоби е номерът на заданието. Можем да използваме това, за да се позоваваме на заданието, когато трябва да го контролираме с команди за управление на заданието.
+: Знакът плюс + показва, че това е заданието, върху което ще се действа, ако използваме команда за управление на заданието без конкретен номер на заданието. Нарича се задание по подразбиране. Заданието по подразбиране винаги е последното добавено към списъка със задачи.
Спрян: Процесът не се изпълнява.
ping www.wdzwdz.com: Командният ред, който стартира процеса.

Командата ps ни казва:

PID: Идентификаторът на процеса на процеса. Всеки процес има уникален идентификатор.
TTY: Псевдо-телетипът (терминалният прозорец), от който е изпълнен процесът.
STAT: Състоянието на процеса.
ВРЕМЕ: Количеството процесорно време, изразходвано от процеса.
КОМАНД: Командата, която стартира процеса.

Това са общи стойности за колоната STAT:

D: Непрекъсваем сън. Процесът е в състояние на изчакване, обикновено чака за вход или изход и не може да бъде прекъснат.
Аз: На празен ход.
Р: Бягане.
S: Прекъсваем сън.
T: Спрян от сигнал за управление на заданието.
Z: Процес на зомбита. Процесът е прекратен, но не е „почистен“ от неговия родителски процес.

Стойността в колоната STAT може да бъде последвана от един от тези допълнителни индикатори:

<: 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="">Можем да видим, че Баш има състояние на Ss. Главното „S“ ни казва, че обвивката на Bash спи и е прекъсваема. Веднага щом имаме нужда от него, той ще отговори. Малките букви „s“ ни казват, че обвивката е лидер на сесията.

Командата ping има състояние T. Това ни казва, че ping е спрян от сигнал за управление на заданието. В този пример това беше Ctrl+Z, който използвахме, за да го поставим на заден план.

Командата ps T има състояние R, което означава изпълнение. Знакът + показва, че този процес е член на групата на преден план. Така че командата ps T работи на преден план.

Командата bg

Командата bg се използва за възобновяване на фонов процес. Може да се използва със или без номер на работа. Ако го използвате без номер на задание, заданието по подразбиране се извежда на преден план. Процесът все още работи във фонов режим. Не можете да изпратите никакви данни към него.

Ако издадем командата bg, ще възобновим нашата ping команда:

bg

Командата ping се възобновява и отново виждаме превъртащия се изход в прозореца на терминала. Показва се името на командата, която е била рестартирана. Това е подчертано на екранната снимка.

  Как да правите екранни снимки от терминала на Linux със Scrot

Но имаме проблем. Задачата се изпълнява във фонов режим и не приема въвеждане. И така, как да го спрем? Ctrl+C не прави нищо. Можем да го видим, когато го въвеждаме, но фоновата задача не получава тези натискания на клавиши, така че продължава да пингува весело.

Всъщност сега сме в странен режим на смесване. Можем да въвеждаме в прозореца на терминала, но това, което въвеждаме, бързо се помита от превъртащия изход от командата ping. Всичко, което въвеждаме, влиза в сила на преден план.

За да спрем нашата фонова задача, трябва да я изведем на преден план и след това да я спрем.

Командата fg

Командата fg ще изведе фонова задача на преден план. Точно като командата bg, тя може да се използва със или без номер на работа. Използването му с номер на работа означава, че ще работи на конкретна работа. Ако се използва без номер на задание, се използва последната команда, изпратена на заден план.

Ако напишем fg, нашата команда ping ще бъде изведена на преден план. Знаците, които въвеждаме, се смесват с изхода от командата ping, но те се управляват от обвивката, сякаш са били въведени в командния ред, както обикновено. И всъщност, от гледна точка на Bash shell, точно това се е случило.

fg

И сега, когато командата ping работи отново на преден план, можем да използваме Ctrl+C, за да я убием.

Ctrl+C

Трябва да изпращаме правилните сигнали

Това не беше точно красиво. Очевидно стартирането на процес във фонов режим работи най-добре, когато процесът не произвежда изход и не изисква въвеждане.

Но, разхвърлян или не, нашият пример постигна:

Поставяне на процес във фонов режим.
Възстановяване на процеса до работещо състояние във фонов режим.
Връщане на процеса на преден план.
Прекратяване на процеса.

Когато използвате Ctrl+C и Ctrl+Z, изпращате сигнали към процеса. Това са стенографски начини за използване на командата kill. Има 64 различни сигнала че убийството може да изпрати. Използвайте kill -l в командния ред, за да ги изброите. kill не е единственият източник на тези сигнали. Някои от тях се повдигат автоматично от други процеси в системата

Ето някои от често използваните.

SIGHUP: Сигнал 1. Автоматично се изпраща към процес, когато терминалът, в който работи, е затворен.
SIGINT: Сигнал 2. Изпратен към процес, който натискате Ctrl+C. Процесът се прекъсва и се казва да бъде прекратено.
SIGQUIT: Сигнал 3. Изпраща се към процес, ако потребителят изпрати сигнал за излизане Ctrl+D.
SIGKILL: Сигнал 9. Процесът незабавно се прекратява и няма да се опита да се затвори чисто. Процесът не се спуска грациозно.
SIGTERM: Сигнал 15. Това е сигналът по подразбиране, изпратен от kill. Това е стандартният сигнал за прекратяване на програмата.
SIGTSTP: Сигнал 20. Изпраща се към процес, когато използвате Ctrl+Z. Той спира процеса и го поставя на заден план.

  Как да инсталирате биткойн възли на Linux

Трябва да използваме командата kill, за да издаваме сигнали, които нямат присвоени комбинации от клавиши.

Допълнителен контрол на работата

Процес, преместен във фонов режим с помощта на Ctrl+Z, се поставя в спряно състояние. Трябва да използваме командата bg, за да стартираме отново. Стартирането на програма като работещ фонов процес е лесно. Добавете амперсанд & в края на командния ред.

Въпреки че е най-добре фоновите процеси да не записват в прозореца на терминала, ще използваме примери, които го правят. Трябва да имаме нещо в екранните снимки, на което можем да се позоваваме. Тази команда ще стартира безкраен цикъл като фонов процес:

докато е вярно; do echo “How-To Geek Loop Process”; сън 3; Свършен &

докато е вярно;  направете ехо

Казват ни номера на заданието и идентификационния номер на процеса на процеса. Номерът на нашата работа е 1, а идентификаторът на процеса е 1979. Можем да използваме тези идентификатори, за да контролираме процеса.

Резултатът от нашия безкраен цикъл започва да се появява в прозореца на терминала. Както преди, можем да използваме командния ред, но всички команди, които издаваме, се разпръскват с изхода от цикъла.

ls

За да спрем нашия процес, можем да използваме задания, за да си напомним какъв е номерът на заданието, и след това да използваме kill.

jobs съобщава, че нашият процес е задача номер 1. За да използваме това число с kill, трябва да го предхождаме със знак за процент %.

jobs
kill %1

kill изпраща сигнала SIGTERM, сигнал номер 15, към процеса и той се прекратява. При следващото натискане на клавиша Enter се показва състоянието на заданието. Той посочва процеса като „прекратен“. Ако процесът не отговори на командата kill, можете да го повишите. Използвайте kill със SIGKILL , сигнал номер 9. Просто поставете числото 9 между командата kill и номера на заданието.

kill 9 %1

Неща, които сме обхванали

Ctrl+C: Изпраща SIGINT, сигнал 2, на процеса – ако приема вход – и му казва да прекрати.
Ctrl+D: Изпраща SISQUIT, сигнал 3, към процеса – ако приема вход – и му казва да излезе.
Ctrl+Z: Изпраща SIGSTP, сигнал 20, към процеса и му казва да спре (прекъсне) и да стане фонов процес.
jobs: Изброява фоновите задания и показва номера им.
bg job_number: Рестартира фонов процес. Ако не предоставите номер на заданието, се използва последният процес, който е превърнат във фонова задача.
fg job_number: извежда фонов процес на преден план и го рестартира. Ако не предоставите номер на заданието, се използва последният процес, който е превърнат във фонова задача.
команден ред &: Добавянето на амперсанд & в края на командния ред изпълнява тази команда като фонова задача, която се изпълнява.
kill %job_number: Изпраща SIGTERM, сигнал 15, към процеса, за да го прекрати.
kill 9 %job_number: Изпраща SIGKILL, сигнал 9, към процеса и го прекратява внезапно.