Управљање процесима у Линук окружењу, било да су у првом плану или се одвијају у позадини, често се обавља путем Баш (Bash) љуске. Користећи Башове уграђене функције и сигнале, имате могућност прецизније контроле над извршавањем команди. У наставку ћемо детаљније објаснити како то функционише.
О процесима
Када се програм покрене у Линукс или било ком другом оперативном систему заснованом на Униксу, тај програм постаје процес. Процес представља интерни приказ програма који је тренутно активан и ради у меморији рачунара. Готово све што је покренуто на вашем рачунару има свој одговарајући процес, укључујући и компоненте вашег графичког окружења радне површине попут ГНОМЕ или КДЕ, као и системске демоне који се покрећу приликом покретања рачунара.
Међутим, не захтева свака радња покретање процеса. На пример, Баш уграђене команде попут cd, pwd, и alias, извршавају се директно унутар Баш љуске вашег терминала, без потребе за покретањем посебног процеса. Управо због тога ове команде се извршавају тако брзо. (Командом `help` у терминалу можете видети списак Баш уграђених команди.)
Процеси могу радити у првом плану, где заузимају терминал док се не заврше, или у позадини, где не блокирају терминал и омогућавају вам да наставите са радом. Међутим, процеси у позадини могу произвести излаз на екран, што може прекинути ваш рад у терминалу.
Пример са проблемом
Почнимо са једноставном командом `ping` за проверу везе са доменом Хов-То Геек. Ова команда ће се извршавати као процес у првом плану:
ping www.wdzwdz.com
Као што очекујемо, резултати се исписују у терминал. Док `ping` ради, не можемо користити терминал за друге команде. Да бисмо зауставили команду, притиснућемо Ctrl+C.
Ctrl+C
Притисак на Ctrl+C је прекинуо извршавање команде `ping`, што је видљиво на снимку екрана. Команда је завршила рад и приказала кратак извештај.
Поновимо команду, али уместо Ctrl+C, притиснућемо Ctrl+Z. Ово неће прекинути команду, већ ће је пребацити у позадину, а ми ћемо поново имати контролу над терминалом.
ping www.wdzwdz.com
Ctrl+Z
Као што видимо на снимку екрана, процес је заустављен, али не и прекинут. То је као да смо зауставили аутомобил на семафору. Процес и даље постоји и чека да се поново покрене. Сада је то посао у позадини.
Команда `jobs` приказује све процесе који су покренути у тренутној терминалској сесији. Пошто су послови заправо процеси, можемо их видети и командом `ps`. Користићемо опцију `-T` (терминал) да прикажемо само процесе у овом терминалу. Ова опција не захтева цртицу `-`.
jobs
ps T
Команда `jobs` нам даје следеће информације:
[1]: Број у угластим заградама је број посла. Овај број се користи за контролу посла.
+: Знак плус показује да је ово подразумевани посао, на који ће се реаговати ако користимо команду за контролу посла без броја посла. Подразумевани посао је увек онај који је последњи додат на листу.
Заустављен: Процес се не извршава.
ping www.wdzwdz.com: Команда која је покренула процес.
Команда `ps` приказује:
PID: Идентификациони број процеса. Сваки процес има јединствени ID.
TTY: Псеудо-телетип (прозор терминала) из кога је процес покренут.
STAT: Статус процеса.
TIME: Време које је процесор провео извршавајући процес.
COMMAND: Команда која је покренула процес.
Уобичајене вредности у колони STAT:
D: Непрекидан сан. Процес чека улаз или излаз и не може се прекинути.
I: Неактиван.
R: Извршава се.
S: Прекидив сан.
T: Заустављен сигналом за контролу посла.
Z: Зомби процес. Процес је прекинут, али његов родитељски процес га није „очистио“.
Вредност у колони STAT може бити праћена додатним индикаторима:
<: високи приоритет
N: ниски приоритет
L: процес има закључане странице у меморији
s: користи се за процесе у реалном времену
+: процес је у групи у првом плану.
l: процес је вођа сесије. Група је покренула љуска.
Видимо да Баш има стање `Ss`. Велико `S` значи да Баш љуска спава и да се може прекинути, док мало `s` означава да је љуска вођа сесије.
Команда `ping` има стање `T`, што значи да је заустављена сигналом за контролу посла (у нашем случају, Ctrl+Z).
Команда `ps T` има стање `R`, што значи да се извршава. Симбол `+` означава да овај процес ради у првом плану, што значи да се команда `ps T` извршава у првом плану.
Команда `bg`
Команда `bg` служи за наставак позадинског процеса. Може се користити са или без броја посла. Без броја посла, наставља се подразумевани посао, који наставља да ради у позадини и не прима унос.
Ако покренемо команду `bg`, наставићемо нашу команду `ping`:
bg
Команда `ping` наставља да ради, а ми видимо испис у терминалу. Назив команде која је поново покренута је приказан на екрану, што је истакнуто на слици.
Сада имамо проблем. Процес ради у позадини, али не прихвата унос. Како да га зауставимо? Ctrl+C не ради. Можемо да куцамо у терминалу, али се испис из команде `ping` преклапа са тим што куцамо. Све што унесемо, дешава се у првом плану.
Да бисмо зауставили наш посао у позадини, морамо га вратити у први план, па га онда зауставити.
Команда `fg`
Команда `fg` пребацује позадински посао у први план. Као и `bg`, може се користити са или без броја посла. Са бројем посла, ради са одређеним послом, а без броја, користи се последња команда која је послата у позадину.
Ако укуцамо `fg`, наша команда `ping` ће се вратити у први план. Знаци које уносимо су помешани са излазом из команде `ping`, али љуска их обрађује као да су унети у командној линији. Из перспективе Баш љуске, то се и дешава.
fg
Сада, када је команда `ping` поново у првом плану, можемо је зауставити притиском на Ctrl+C.
Ctrl+C
Сигнали
Наш пример је био мало збуњујући. Јасно је да је покретање процеса у позадини најбоље када процес не генерише излаз и не тражи улаз.
Ипак, наш пример је постигао следеће:
- Постављање процеса у позадину.
- Враћање процеса на рад у позадини.
- Враћање процеса у први план.
- Прекидање процеса.
Приликом коришћења Ctrl+C и Ctrl+Z, шаљемо сигнале процесу. Ово су пречице за команду `kill`. Постоји 64 различита сигнала које `kill` може послати. Користите `kill -l` у командној линији да их видите. `kill` није једини извор ових сигнала. Неке од њих аутоматски подижу други процеси у систему.
Ево неких најчешће коришћених сигнала:
- SIGHUP: Сигнал 1. Шаље се процесу аутоматски када се затвори терминал.
- SIGINT: Сигнал 2. Шаље се процесу када притиснемо Ctrl+C. Процес се зауставља и прекида.
- SIGQUIT: Сигнал 3. Шаље се процесу ако корисник пошаље сигнал за излаз (Ctrl+D).
- SIGKILL: Сигнал 9. Процес се одмах прекида без могућности да се уредно затвори.
- SIGTERM: Сигнал 15. Ово је подразумевани сигнал који шаље `kill`. То је стандардни сигнал за завршетак програма.
- SIGTSTP: Сигнал 20. Шаље се процесу када се користи Ctrl+Z. Зауставља процес и ставља га у позадину.
Команду `kill` користимо за слање сигнала који немају пречице на тастатури.
Даља контрола послова
Процес који је пребачен у позадину помоћу Ctrl+Z је заустављен. Морамо користити команду `bg` да га поново покренемо. За покретање програма као позадинског процеса, додајте знак `&` на крај командне линије.
Иако је најбоље да позадински процеси не исписују ништа у терминал, ми ћемо користити примере који то раде, како бисмо их могли приказати на снимку екрана. Следећа команда покреће бесконачну петљу као позадински процес:
while true; do echo "How-To Geek Loop Process"; sleep 3; done &
Добили смо информацију о броју посла и идентификационом броју процеса. Број нашег посла је 1, а ID процеса је 1979. Ове бројеве можемо користити за контролу процеса.
Излаз из наше бесконачне петље почиње да се појављује у терминалу. Можемо да куцамо команде, али су оне прекинуте исписом из процеса петље.
ls
Да бисмо зауставили наш процес, можемо користити `jobs` да се подсетимо који је број посла, а затим да га зауставимо командом `kill`.
`jobs` показује да је наш процес посао број 1. Да бисмо користили тај број са `kill`, морамо му додати знак процента `%` испред.
jobs
kill %1
`kill` шаље сигнал SIGTERM, сигнал број 15, процесу, који се завршава. Након притиска на тастер Enter, приказује се статус задатка, који је „завршен“. Ако процес не реагује на команду `kill`, можете послати сигнал SIGKILL, сигнал број 9. У том случају, ставите број 9 између команде `kill` и броја посла.
kill 9 %1
Преглед наученог
Ево листе команди и сигнала које смо споменули:
- Ctrl+C: Шаље SIGINT (сигнал 2) процесу и прекида га.
- Ctrl+D: Шаље SIGQUIT (сигнал 3) процесу и прекида га.
- Ctrl+Z: Шаље SIGTSTP (сигнал 20) процесу и зауставља га, стављајући га у позадину.
- jobs: Приказује позадинске послове и њихове бројеве.
- bg job_number: Поново покреће процес у позадини. Без броја посла, користи се последњи процес који је послат у позадину.
- fg job_number: Враћа процес у позадини у први план и поново га покреће. Без броја посла, користи се последњи процес који је послат у позадину.
- command &: Додавање знака `&` на крај команде је извршава у позадини.
- kill %job_number: Шаље SIGTERM (сигнал 15) процесу и прекида га.
- kill 9 %job_number: Шаље SIGKILL (сигнал 9) процесу и прекида га нагло.