Запустити процес у фоні в Linux. Що потрібно знати новачкові в Linux: керування завданнями Linux запуск команди у фоновому режимі

Як і будь-яка інша багатозадачна система, Linux одночасно виконує кілька процесів. Взагалі, не буду вводити Вас в оману, тому що звичайний однопроцесорний комп'ютер може виконувати тільки одну задачу в даний момент часу, тому Linux ставить процеси в чергу на виконання.

Існує кілька основних команд для управління процесами

  • ps- Виводити список запущених процесів
  • kill- Відправляє сигнал на один або кілька процесів (в основному, щоб "вбити" їх)
  • jobs- альтернативний шлях для перегляду процесів запущених Вами
  • bg- ставить виконання процесу у фоновий режим
  • fg- виводить виконання процесу із фонового режиму

Хоча може здатися, що ці знання є досить абстрактними, але вони можуть знайти своє практичне застосуваннянавіть для середнього користувача, який використовує графічний інтерфейс. Можливо, Ви ще не знаєте, що більшість графічних програм (якщо не всі) можна запустити за допомогою командного рядка. Для прикладу спробуємо запустити браузер, думаю у більшості linux-оїдів варто або Google Chromeабо FireFox

Enej@linux:/home/pub/www/vv$ google-chrome Створення нового window in existing browser session.

Можна вказати URL, яку Ви бажаєте відкрити

Enej@linux:/home/pub/www/vv$ google-chrome http://сайт Created new window in existing browser session.

У мене вже запущений Хром через графічний інтерфейс, тому браузер повідомляє, що створюється нове вікно в існуючій сесії і віддає управління командному рядку. Або, наприклад, якщо потрібно відкрити графічний файловий менеджерз правами рута (приклад працюватиме для графічної оболонки Gnome із встановленим Nautilus)

Enej@linux:/home/pub/www/vv$ sudo nautilus /root/ password for enej:

Оскільки процес був запущений не у фоновому режимі, то у цьому вікні терміналу Ви більше не можете виконувати будь-які дії (щоб завершити процес можна натиснути CTRL + C).

Фоновий режим

Для того, щоб було простіше жити, при запуску графічних програм або процесів, які можуть довго працювати, зазвичай їх виконання ставлять у фоновий режим, наприклад, запустимо браузер у фоновому режимі

Enej@linux:/home/pub/www/vv$ google-chrome http://сайт & 9248

Знак амперсанта ( & ) в кінці виклику команди означає, що виконання процесу потрібно помістити у фоновий режим. У такому випадку залишається можливість працювати з цим вікном терміналу.

Але раптом ви забули поставити ампресант наприкінці виклику, тоді існує інший спосіб. Потрібно спочатку зупинити виконання, натиснувши CTRL + Z, тоді отримуємо управління командним рядком і можемо викликати команду bg, яка поставить останній запущений процес у фоновий режим. Сказане на прикладі

Enej@linux:/home/pub/www/vv$ google-chrome http://сайт ^Z + Stopped google-chrome http://сайт enej@linux:/home/pub/www/vv$ bg + google- chrome http://сайт &

Команда fgвиводить останній запущений процес із фонового режиму.

Список запущених процесів

Оскільки тепер Ви вмієте ставити команди у фоновий режим, було добре переглянути їх список. Для цього використовується команда jobsабо потужніша ps

Enej@linux:/home/pub/www/vv$ jobs - Running nm-applet & (wd: ~/bin) + Running google-chrome http://сайт & enej@linux:/home/pub/www/vv $ ps PID TTY TIME CMD 2304 pts/0 00:00:02 bash 11104 pts/0 00:00:01 chrome 11108 pts/0 00:00:00 chrome 11110 pts/0 00:00:00 00:00:00 chrome 12088 pts/0 00:00:00 ps 21165 pts/0 00:00:27 nm-applet

Як "вбити" процес?

Якщо процес перестає відповідати на події (тобто завис), його потрібно примусово "вбити". Думаю ті, хто використовує FireFox стикалися з цим. Для таких завдань використовується команда kill. Але для початку потрібно якимось чином визначити процес. Для цього можна використати команду jobsабо ps. За допомогою першої можна дізнатися номер процесу, за допомогою другого його ідентифікатор.

Enej@linux:/home/pub/www/vv$ google-chrome http://freaksidea..com & 15181 enej@linux:/home/pub/www/vv$ ps PID TTY TIME CMD 2304 pts/0 00: 00:02 bash 15181 pts/0 00:00:00 chrome 15238 pts/0 00:00:00 ps 21165 pts/0 00:00:27 nm-applet enej@linux:/home/pub/www/vv$ill 15181

Команди fgі bgв якості першого аргументу можуть приймати номер запущеного процесу для його наступного введення/виведення в/з фонового режиму.

Детальніше про kill

Насправді команда killвикористовується для надсилання різних сигналів процесам. Просто в більшості випадків цей сигнал каже команді, що вона має завершитись. Якщо програми правильно написані, то вони прослуховують різні сигнали від операційної системиі відповідають на них. Наприклад, текстовий редакторповинен прослуховувати будь-який сигнал, який повідомляє, що користувачів виходить із системи або що комп'ютер вимикається. Коли він (текстовий редактор) "почув" такий сигнал, він має зберегти відкриті документиперед тим, як закінчити свою роботу. Команда killвміє відсилати кілька типів сигналів, щоб дізнатись які, введіть kill -l. Нижче наведено список найчастіше використовуваних сигналів (число в дужках - номер сигналу)

  • SIGNUP(1)- спочатку був призначений для того, щоб інформувати програму про втрату зв'язку з терміналом, що управляє (термінали часто підключалися до системи за допомогою модемів, так що назва сигналу походить від hung up - повісити трубку). Сигнал SIGHUP надсилається додатку так само й у тому випадку, якщо процес-лідер сесії завершив свою роботу. Багато програм-демони, у яких немає лідера сесії, так само обробляють цей сигнал. У відповідь отримання SIGHUP демон зазвичай перезапускається (чи просто повторно читає файл конфігурації). За промовчанням програма, що отримала цей сигнал, завершується.
  • SIGINT(2)- зазвичай надсилається процесу, якщо користувач терміналу дав команду перервати процес (зазвичай ця команда - поєднання клавіш Ctrl + C)
  • SIGTERM(15)- Викликає "ввічливе" завершення програми. Отримавши цей сигнал, програма може виконати необхідні перед завершенням операції (наприклад, зберегти відкриті документи). Отримання SIGTERM свідчить не про помилку у програмі, а про бажання ОС чи користувача завершити її.
  • SIGKILL(9)- Викликає примусове завершення роботи програми. Програма неспроможна ні обробити, ні ігнорувати цей сигнал.

За замовчуванням команда killвідправляє SIGTERMсигнал, але можна вказати номер сигналу або його ім'я. Допустимо, що у Вас завис Chrome (у мене іноді флеш плеєр перестає адекватно працювати)

Enej@linux:/home/pub/www/vv$ google-chrome http://сайт & 22066 enej@linux:/home/pub/www/vv$ jobs - Running nm-applet & (wd: ~/bin) + Running google-chrome http://сайт & enej@linux:/home/pub/www/vv$ kill -SIGTERM %2 enej@linux:/home/pub/www/vv$ kill -SIGKILL %2 enej@linux :/home/pub/www/vv$ kill -9 %2

P.S.: думаю дуже цікавим для початківців буде 2 команди: notify-send(відправляє повідомлення через графічну оболонку, в Gnome з'являється зверху праворуч) і espeak(Синтезатор мови). Якщо один із них у Вас немає, встановити можна за допомогою команди apt-get

Enej@linux:/home/pub/www/vv$ sudo apt-get install espeak notify-send

Адміністрування сервера під управлінням Linux часто супроводжується множинними маніпуляціями команд у вікні терміналу. Це звична картина для тих, хто адмініструє сервери на Linux, і в деяких випадках зручно виконувати команди у фоновому режимі. Це цілком може бути використане на практиці, і варто відзначити причини, чому це може бути корисним:
— Коли термінал переповнюється купою повідомлень, та й виконувати паралельно додаткові дії неможливо;
— Якщо ви закриваєте термінал, то зупиняється поточний процес із його дочірніми процесами;
Ці проблеми вирішуються елементарно, кажучи простою мовоюнам необхідно повністю відокремити виконуваний процес від керуючого терміналу.

У цій посаді ми розглянемо корисну можливість Linux виконання команд у фоновому режимі. Іншими словами, процес запущений вами буде виконуватися окремо від керуючого терміналу.

Як запускати команди або процеси у фоновому режимі
Якщо ваш процес запущено у вікні терміналу, то призупинити його можна за допомогою команди Ctrl+Z, напевно, це багато хто знає, і подумає, і що з цього. І ось що цікаве, призупинивши таким чином процес, ми можемо продовжити його у фоновому режимі, для цього необхідно ввести команду

Після введення цієї команди процес буде продовжено, але вже у фоновому режимі. Щоб переглянути всі процеси, що виконуються у фоновому режимі, можна ввести команду

Давайте переглянемо простий приклад, як це можна застосувати. Припустимо, у нас є , який нам необхідно розпакувати, проте нам ніколи чекати, і ми хочемо працювати паралельно.

Розпакування архіву у фоновому режимі

$ tar -czf home.tar.gz .

Тиснемо Cntr+Zпотім вводимо команди

$bg$jobs

Другий спосіб – це додати символ & наприкінці команди, це повідомить системі, що потрібно виконувати команду у фоновому режимі.

$ tar -czf home.tar.gz . & $ jobs

Подібний спосіб дозволяє виконувати процеси у фоновому режимі, проте, STDIN, STDOUT, STDERRвсе ще пов'язані з терміналом. Тепер давайте досягнемо того, щоб процес виконувався навіть при закритті терміналу.

Виконання процесу після закриття вікна терміналу
Щоб процес продовжив працювати навіть після закриття вікна терміналу, ми можемо використати команду disown. Вона відчепить процес від оболонки вікна терміналу, після чого буде виконуватися навіть після закриття вікна консолі.
Давайте розглянемо приклад використання стандартної команди rsync, спробуємо виконати її у фоновому режимі, та відчепимо процес від терміналу.

$ sudo rsync Templates/* /var/www/html/ & $ jobs $ disown -h %1 $ jobs

Ви також можете використовувати команду nohup, вона дозволить продовжити виконання процесу навіть коли користувач виходить із оболонки системи.

$ nohup tar -czf iso.tar.gz Templates/* & $ jobs

Як відокремити процес від керуючого терміналу Linux
Щоб повністю відокремити процес від керуючого терміналу, можна також використовувати команду, яка буде ефективною при використанні графічного інтерфейсу (GUI), наприклад, браузер Firefox.

$firefox/dev/null &

У системі Linux (та й практично у всіх Unix-системах) /dev/null є спеціальним файлом пристрою, який так само називають «порожнім пристроєм». Запис у нього проводитися успішно незалежно від обсягу записаної інформації, читання з нього еквівалентне зчитуванню кінця файлу (EOF).

Минулого разу ми говорили про роботу з потоками введення, виведення та помилок у bash-скриптах, про дескриптори файлів та про перенаправлення потоків. Зараз ви знаєте вже багато для того, щоб писати щось своє. На даному етапі освоєння bash у вас можуть виникнути питання про те, як управляти працюючими скриптами, як автоматизувати їх запуск.

Досі ми вводили імена скриптів у командний рядок і натискали Enter, що призводило до негайного запуску програм, але це не єдиний спосіб виклику сценаріїв. Сьогодні ми поговоримо про те, як скрипт може працювати з сигналами Linux, про різні підходи до запуску скриптів та управління ними під час роботи.

Сигнали Linux

У Linux існує понад три десятки сигналів, які генерує система або програми. Ось список найчастіше використовуваних, які, напевно, стануть у нагоді при розробці сценаріїв командного рядка.
Код сигналу
Назва
Опис
1
SIGHUP
Закриття терміналу
2
SIGINT
Сигнал зупинення процесу користувачем з терміналу (CTRL+C)
3
SIGQUIT
Сигнал зупинення процесу користувачем з терміналу (CTRL+\) з дампом пам'яті
9
SIGKILL
Безумовне завершення процесу
15
SIGTERM
Сигнал запиту завершення процесу
17
SIGSTOP
Примусове зупинення виконання процесу, але не завершення його роботи
18
SIGTSTP
Призупинення процесу з терміналу (CTRL+Z), але не завершення роботи
19
SIGCONT
Продовження виконання раніше зупиненого процесу

Якщо оболонка bash отримує сигнал SIGHUP, коли ви закриваєте термінал, вона завершує роботу. Перед виходом вона відправляє сигнал SIGHUP всім запущеним у ній процесам, включаючи скрипти, що виконуються.

Сигнал SIGINT призводить до тимчасової зупинки роботи. Ядро Linuxперестає виділяти оболонці процесорний час. Коли це відбувається, оболонка повідомляє процеси, надсилаючи їм сигнал SIGINT .

Bash-скрипти не контролюють ці сигнали, але вони можуть розпізнавати їх і виконувати деякі команди для підготовки скрипту до наслідків, викликаних сигналами.

Надсилання сигналів скриптам

Оболонка bash дозволяє відправляти скриптам сигнали, користуючись комбінаціями клавіш на клавіатурі. Це виявляється дуже доречним якщо потрібно тимчасово зупинити скрипт або завершити його роботу.

Завершення роботи процесу

Комбінація клавіш CTRL + C генерує сигнал SIGINT і відправляє його всім процесам, що виконуються в оболонці, що призводить до завершення їхньої роботи.

Виконаємо в оболонці таку команду:

$ sleep 100
Після цього завершимо її роботу комбінацією клавіш CTRL+C.


Завершення роботи процесу з клавіатури

Тимчасова зупинка процесу

Комбінація клавіш CTRL + Z дозволяє згенерувати сигнал SIGTSTP, який припиняє роботу процесу, але не завершує його виконання. Такий процес залишається у пам'яті, його роботу можна відновити. Виконаємо в оболонці команду:

$ sleep 100
І тимчасово зупинимо її комбінацією клавіш CTRL+Z.


Призупинення процесу

Число у квадратних дужках – це номер завдання, який оболонка призначає процесу. Оболонка розглядає процеси, що виконуються в ній, як завдання з унікальними номерами. Перший процес призначається номер 1, другий - 2, і так далі.

Якщо ви призупините завдання, прив'язане до оболонки, і спробуєте вийти з неї, bash видасть попередження.

Переглянути призупинені завдання можна такою командою:

Ps -l


Список завдань

У колонці S виводить стан процесу для призупинених процесів виводиться T . Це вказує на те, що команда або припинена, або перебуває в стані трасування.

Якщо потрібно завершити роботу зупиненого процесу, можна скористатися командою kill . Подробиці про неї можна почитати.

Виглядає її виклик так:

Kill processID

Перехоплення сигналів

Для того, щоб увімкнути в скрипті відстеження сигналів Linux, використовується команда trap. Якщо скрипт отримує сигнал, вказаний під час виклику цієї команди, він обробляє його самостійно, при цьому оболонка такий сигнал не оброблятиме.

Команда trap дозволяє скрипту реагувати на сигнали, інакше їх обробка виконується оболонкою без участі.

Розглянемо приклад, у якому показано, як із виклику команди trap задається код, який треба виконати, і перелік сигналів, розділених пробілами, які хочемо перехопити. В даному випадку це лише один сигнал:

#!/bin/bash trap "echo " Trapped Ctrl-C"" SIGINT echo Цей тест script count=1 while [ $count -le 10 ] do echo "Loop #$count" sleep 1 count=$(($ count + 1)) done
Команда trap, використана в цьому прикладі, виводить текстове повідомленнящоразу, коли вона виявляє сигнал SIGINT, який можна згенерувати, натиснувши Ctrl+C на клавіатурі.


Перехоплення сигналів

Щоразу, коли ви натискаєте клавіші CTRL + C , скрипт виконує команду echo , вказану під час виклику trace замість того, щоб дозволити оболонці завершити його роботу.

Перехопити сигнал виходу зі скрипта можна, використовуючи під час виклику команди trap ім'я сигналу EXIT:

#!/bin/bash trap "echo Goodbye..." EXIT count=1 while [ $count -le 5 ] do echo "Loop #$count" 1 count=$(($count + 1)) done


Перехоплення сигналу виходу із скрипту

При виході зі скрипту, чи це нормальне завершення його роботи або завершення, викликане сигналом SIGINT , спрацює перехоплення і оболонка виконає команду echo .

Модифікація перехоплених сигналів та скасування перехоплення

Для модифікації сигналів, що перехоплені скриптом, можна виконати команду trap з новими параметрами:

#!/bin/bash trap "echo "Ctrl-C is trapped."" SIGINT count=1 while [ $count -le 5 ] do echo "Loop #$count" 1 count=$(($count + 1) ) done trap "Echo "I modified the trap!""


Модифікація перехоплення сигналів

Після модифікації сигнали будуть оброблятися по-новому.

Перехоплення сигналів можна і скасувати, для цього достатньо виконати команду trap, передавши їй подвійне тире та ім'я сигналу:

#!/bin/bash trap "echo "Ctrl-C is trapped."" SIGINT count=1 while [ $count -le 5 ] do echo "Loop #$count" 1 count=$(($count + 1) ) done trap -- SIGINT echo "Якщо вимкнуто trap" count=1 while [ $count -le 5 ] do echo "Second Loop #$count" sleep 1 count=$(($count + 1)) done
Якщо скрипт отримає сигнал до скасування перехоплення, він обробить його так, як задано чинній команді trap. Запустимо скрипт:

$./myscript
І натиснемо CTRL+C на клавіатурі.


Сигнал, перехоплений до скасування перехоплення

Перше натискання CTRL + C довелося на момент виконання скрипта, коли перехоплення сигналу було чинним, тому скрипт виконав призначену сигналу команду echo . Після того, як виконання дійшло до команди скасування перехоплення, команда CTRL+C спрацювала звичайним чином, завершивши роботу скрипту.

Виконання сценаріїв командного рядка у фоновому режимі

Іноді bash-скриптам потрібно багато часу для виконання якогось завдання. При цьому вам знадобиться можливість нормально працювати в командному рядку, не чекаючи завершення скрипту. Реалізувати це не так уже й складно.

Якщо ви бачили список процесів, що виводиться командою ps, ви могли помітити процеси, які виконуються на тлі і не прив'язані до терміналу.
Напишемо такий скрипт:

#!/bin/bash count=1 while [ $count -le 10 ] do sleep 1 count=$(($count + 1)) done
Запустимо його, вказавши після імені символ амперсанда (&):

$ ./myscipt &
Це призведе до того, що його буде запущено як фоновий процес.


Запуск скрипту у фоновому режимі

Скрипт буде запущений у фоновому процесі, у термінал виведеться його ідентифікатор, а коли його виконання завершиться, ви побачите повідомлення про це.

Зверніть увагу на те, що хоча скрипт виконується у фоні, він продовжує використовувати термінал для виведення повідомлень у STDOUT і STDERR , тобто текст, що виводиться ним, або повідомлення про помилки можна буде побачити в терміналі.


Список процесів

При такому підході, якщо вийти з терміналу, скрипт, що виконується у фоні, також завершить роботу.

Що, якщо потрібно, щоб скрипт продовжував працювати і після закриття терміналу?

Виконання скриптів, які не завершують роботу під час закриття терміналу

Скрипти можна виконувати у фонових процесах навіть після виходу із термінальної сесії. Для цього можна скористатися командою nohup. Ця команда дозволяє запустити програму, блокуючи сигнали SIGHUP , що надсилаються процесу. В результаті процес буде виконуватися навіть при виході з терміналу, в якому його було запущено.

Застосуємо цю методику під час запуску нашого скрипта:

Nohup ./myscript &
Ось що буде виведено до терміналу.


Команда nohup

Команда nohup відв'язує процес від терміналу. Це означає, що процес втратить посилання на STDOUT та STDERR . Для того, щоб не втратити дані, що виводяться скриптом, nohup автоматично перенаправляє повідомлення, що надходять у STDOUT і STDERR, у файл nohup.out .

Зверніть увагу на те, що при запуску декількох скриптів з однієї і тієї ж директорії те, що вони виводять, потрапить в один файл nohup.out.

Перегляд завдань

Команда jobs дозволяє переглядати поточні завдання, що виконуються в оболонці. Напишемо такий скрипт:

#!/bin/bash count=1 while [ $count -le 10 ] do echo "Loop #$count" sleep 10 count=$(($count + 1)) done
Запустимо його:

$./myscript
І тимчасово зупинимо комбінацією клавіш CTRL+Z.


Запуск та призупинення скрипту

Запустимо той самий скрипт у фоновому режимі, при цьому перенаправимо виведення скрипту у файл так, щоб він нічого не виводив на екрані:

$ ./myscript > outfile &
Виконавши тепер команду jobs, ми побачимо відомості як про зупинений скрипт, так і про те, який працює у фоні.


Отримання відомостей про скрипти

Ключ -l під час виклику команди jobs вказує на те, що нам потрібна інформація про ID процесів.

Перезапуск призупинених завдань

Щоб перезапустити скрипт у фоновому режимі, можна скористатися командою bg .

Запустимо скрипт:

$./myscript
Натисніть CTRL + Z , що зупинить його виконання. Виконаємо наступну команду:

$bg


Команда bg

Тепер скрипт виконується у фоновому режимі.

Якщо у вас є кілька призупинених завдань, для перезапуску конкретного завдання команді bg можна передати його номер.

Для перезапуску завдання у звичайному режимі скористайтесь командою fg:

Планування запуску скриптів

Linux надає пару способів запуску bash-скриптів у заданий час. Це команда at та планувальник завдань cron.

Виклик команди at виглядає так:

At [-f filename] time
Ця команда розпізнає безліч форматів часу.

  • Стандартний, із зазначенням годин та хвилин, наприклад – 10:15.
  • З використанням індикаторів AM/PM до або після полудня, наприклад - 10:15PM.
  • З використанням спеціальних імен, таких, як now, noon, midnight.
На додаток до можливості вказівки часу запуску завдання, команді at можна передати і дату, використовуючи один із форматів, що підтримуються їй.
  • Стандартний формат вказівки дати, коли дата записується за шаблонами MMDDYY , MM/DD/YY , або DD.MM.YY .
  • Текстове подання дати, наприклад, Jul 4 або Dec 25, при цьому рік можна вказати, а можна обійтися і без нього.
  • Запис виду now + 25 minutes.
  • Запис вигляду 10:15PM tomorrow.
  • Запис вигляду 10:15 + 7 days.
Не заглиблюватимемося в цю тему, розглянемо простий варіант використання команди:

$ at -f ./myscript now


Планування завдань з використанням команди at

Ключ -M при виклику at використовується для відправки того, що виведе скрипт, електронній поштіякщо система відповідним чином налаштована. Якщо відправлення електронного листанеможлива, цей ключ просто придушить висновок.

Для того щоб переглянути список завдань, що чекають на виконання, можна скористатися командою atq:


Список завдань, що очікують виконання

Видалення завдань, що очікують виконання

Видалити завдання, яке очікує на виконання, дозволяє команда atrm . Під час її виклику вказують номер завдання:

$ atrm 18


Видалення завдання

Запуск скриптів за розкладом

Планування одноразового запуску скриптів з використанням команди at здатне полегшити життя в багатьох ситуаціях. Але як бути, якщо потрібно, щоб скрипт виконувався в той самий час щодня, або раз на тиждень, або раз на місяць?

У Linux є утиліта crontab, що дозволяє планувати запуск скриптів, які потрібно виконувати регулярно.

Crontab виконується у фоні і, ґрунтуючись на даних у так званих cron-таблицях, запускає завдання за розкладом.

Щоб переглянути існуючу таблицю завдань cron , скористайтеся такою командою:

$ crontab -l
При плануванні запуску скрипту за розкладом crontab приймає дані про те, коли потрібно виконати завдання у такому форматі:

Хвилина, година, день місяця, місяць, день тижня.
Наприклад, якщо треба, щоб якийсь скрипт з ім'ям command виконувався щодня о 10:30, цьому відповідатиме такий запис у таблиці завдань:

30 10 * * * command
Тут універсальний символ "*", використаний для полів, що задають день місяця, місяць і день тижня, вказує на те, що cron повинен виконувати команду кожного дня кожного місяця о 10:30.

Якщо, наприклад, треба, щоб скрипт запускався о 4:30PM щопонеділка, знадобиться створити в таблиці завдань такий запис:

30 16 * * 1 command
Нумерація днів тижня починається з 0,0 означає неділю, 6 – суботу. Ось ще один приклад. Тут команда виконуватиметься о 12 годині дня в перший день кожного місяця.

00 12 1 * * command
Нумерація місяців починається з першого.
Щоб додати запис до таблиці, потрібно викликати crontab з ключем -e:

Crontab -e
Потім можна вводити команди формування розкладу:

30 10 * * * /home/likegeeks/Desktop/myscript
Завдяки цій команді скрипт буде викликатись щодня о 10:30. Якщо ви зіткнетеся з помилкою «Resource temporarily unavailable», виконайте наведену нижче команду з правами root-користувача:

$ rm -f /var/run/crond.pid
Організувати періодичний запуск скриптів з використанням cron можна ще простіше, скориставшись кількома спеціальними директоріями:

/etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly
Якщо помістити файл скрипта в одну з них, це призведе відповідно до його щогодинного, щоденного, щотижневого або щомісячного запуску.

Запуск скриптів при вході в систему та при запуску оболонки

Автоматизувати запуск скриптів можна, спираючись на різні події, такі як вхід користувача до системи або запуск оболонки. можна почитати про файли, які обробляються у таких ситуаціях. Наприклад, це наступні файли:

$HOME/.bash_profile $HOME/.bash_login $HOME/.profile
Щоб запускати скрипт під час входу до системи, помістіть його виклик у файл.bash_profile .

А як щодо запуску скриптів під час відкриття терміналу? Організувати це допоможе файл.bashrc.

Підсумки

Сьогодні ми розібрали питання щодо управління життєвим цикломсценаріїв, поговорили про те, як запускати скрипти на тлі, як планувати їх виконання за розкладом. Наступного разу читайте про функції в bash-скриптах та розробку бібліотек.

Шановні читачі! А ви використовуєте засоби планування запуску сценаріїв командного рядка за розкладом? Якщо так – розкажіть будь ласка про них.

Запуск та обробка фонових процесів: управління завданнями

Ви, напевно, помітили, що після того, як ви ввели команду в Terminal "е, вам зазвичай потрібно дочекатися завершення її роботи, перш ніж shell поверне вам керування. Це означає, що ви запустили команду впріоритетному режимі . Проте трапляються випадки, коли це небажано.

Допустимо, наприклад, що ви вирішили рекурсивно скопіювати один великий каталог в інший. Ви також вирішили ігнорувати помилки, тому ви перенаправили канал помилок у/dev/null :

cp -R images/ /shared/ 2>/dev/null

Виконання такої команди може зайняти кілька хвилин, поки вона не виконається повністю. У вас є два варіанти вирішення: перший - жорстокий, що передбачає зупинку (вбивання) команди, а потім повторне її виконання, але вже у відповідний час. Для цього натисніть Ctrl+c : при цьому процес буде завершено, а ви повернетеся назад до рядка запрошення. Але зачекайте, поки не робіть цього! Читайте далі.

Допустимо, ви хочете, щоб команда виконувалася, а ви займалися чимось іншим. Рішенням буде запуск процесу вфоновому режимі . Для цього натисніть Ctrl+z , щоб призупинити процес:

При цьому процес продовжить свою роботу, але вже як фонове завдання, як це зазначено знаком & (амперсанд) наприкінці рядка. Потім ви повернетеся назад у рядок запрошення та зможете продовжити роботу. Процес, який виконується як фонове завдання, або у фоновому режимі, називається фоновимзавданням .

Звичайно, ви можете відразу запускати процеси як фонові завдання, додаючи знак & наприкінці команди. Наприклад, ви можете запустити команду копіювання каталогу у фоновому режимі, набравши:

cp -R images/ /shared/ 2>/dev/null &

Якщо хочете, ви також можете відновити цей процес у пріоритетному режимі та дочекатися його завершення, набравшиfg (ForeGround - Пріоритетний). Щоб перевести його назад у фоновий режим, введіть наступну послідовність Ctrl+z , bg .

У такий спосіб ви можете запустити кілька завдань: кожній команді буде присвоєно номер завдання. Команда shell "а jobs виводить список усіх завдань, пов'язаних із поточним shell Перед завданням ставиться знак + , що вказує на останній процес, запущений у фоновому режимі. Для відновлення конкретного завдання у пріоритетний режим ви можете ввести командуfg , де - номер завдання, наприклад,fg 5 .

Завдання та процеси

Будь-яка виконується в Linux програманазивається процесом. Linux як багатозадачна система характеризується тим, що одночасно може виконуватися безліч процесів, що належать одному чи кільком користувачам. Вивести список процесів, що виконуються в даний час, можна командою ps, наприклад, так:

/home/larry# ps PID TT STAT TIME COMMAND 24 3 S 0:03 (bash) 161 3 R 0:00 ps /home/larry#

Зверніть увагу, що за замовчуванням команда psвиводить список тільки тих процесів, які належать користувачу, що запустив її. Щоб подивитися всі процеси, що виконуються в системі, потрібно подати команду ps -a . Номери процесів(process ID, або PID ), вказані у першій колонці, є унікальними номерами, які система присвоює кожному працюючому процесу. Остання колонка, під назвою COMMAND, вказує ім'я працюючої команди. В даному випадку в списку вказані процеси, які запустив сам користувач larry. У системі працює ще багато інших процесів, їхній повний список можна переглянути командою ps-aux. Однак серед команд, запущених користувачем larry, є тільки bash (командна оболонка для користувача larry) і сама команда ps. Видно, що оболонка bash працює одночасно з командою ps. Коли користувач ввів команду ps, оболонка bash почала її виконувати. Після того, як команда psзакінчила свою роботу (таблиця процесів виведена на екран), управління повертається процесу bash. Тоді оболонка bash виводить на екран запрошення і чекає на нову команду.

Працюючий процес також називають завданням(Job). Поняття процес та завдання є взаємозамінними. Однак, зазвичай процес називають завданням, коли мають на увазі управління завданням(Job control). Управління завданням – це функція командної оболонки, яка надає користувачеві можливість перемикатися між кількома завданнями.

У більшості випадків користувачі запускають лише одне завдання – це буде та команда, яку вони ввели останньою у командній оболонці. Однак багато командних оболонок (включаючи bash і tcsh) мають функції управління завданнями(job control), що дозволяють запускати одночасно кілька команд або завдань(jobs) і, при необхідності, перемикатися між ними.

Управління завданнями може бути корисним, якщо, наприклад, ви редагуєте великий текстовий файлі хочете тимчасово перервати редагування, щоб зробити якусь іншу операцію. За допомогою функцій керування завданнями можна тимчасово залишити редактор, повернутися до запрошення командної оболонки та виконати інші дії. Коли вони будуть зроблені, можна повернутись назад до роботи з редактором і виявити його в тому ж стані, в якому він був покинутий. У функцій управління завданнями є багато корисних застосувань.

Передній план та фоновий режим

Завдання можуть бути або на передньому плані(foreground), або фоновими(Background). На передньому плані у будь-який час може бути лише одне завдання. Завдання на передньому плані - це завдання, з яким ви взаємодієте; воно отримує введення з клавіатури і посилає виведення на екран (якщо, зрозуміло, ви не перенаправили введення або виведення кудись ще). Навпаки, фонові завдання не одержують введення з терміналу; як правило, такі завдання не потребують взаємодії з користувачем.

Деякі завдання виконуються дуже довго, і під час їхньої роботи не відбувається нічого цікавого. Прикладом таких завдань є компілювання програм, а також стиснення великих файлів. Немає жодних причин дивитися на екран і чекати, коли ці завдання виконуються. Такі завдання слід запускати у фоновому режимі. У цей час можна працювати з іншими програмами.

Для управління виконанням процесів у Linux передбачено механізм передачі сигналів. Сигнал – це здатність процесів обмінюватися стандартними короткими повідомленнями безпосередньо за допомогою системи. Повідомлення-сигнал не містить жодної інформації, крім номера сигналу (для зручності замість номера можна використовувати визначене системою ім'я). Для того щоб передати сигнал, процесу достатньо задіяти системний виклик kill(), А для того, щоб прийняти сигнал, не потрібно нічого. Якщо процесу потрібно якось по-особливому реагувати на сигнал, він може зареєструвати обробника якщо обробника немає, за нього відреагує система. Як правило, це призводить до негайного завершення процесу, який отримав сигнал. Обробник сигналу запускається асинхронно, негайно після отримання сигналу, щоб процес у цей час не робив.

Два сигнали – номер 9 ( KILL) та 19 ( STOP) - Завжди обробляє система. Перший потрібний для того, щоб убити процес напевно (звідси і назва). Сигнал STOP зупиняє процес: в такому стані процес не видаляється з таблиці процесів, але і не виконується до тих пір, поки не отримає сигнал 18 ( CONT) - після чого продовжить роботу. У командній оболонці Linuxсигнал STOPможна передати активному процесу за допомогою керуючої послідовності Ctrl -Z .

Сигнал номер 15 ( TERM) служить для переривання роботи завдання. При перериванні(Interrupt) завдання процес гине. Переривання завдань зазвичай здійснюється керуючою послідовністю Ctrl -C. Відновити перерване завдання неможливо. Слід також знати, деякі програми перехоплюють сигнал TERM(за допомогою оброблювача), так що натискання комбінації клавіш Ctrl -C(о) може не перервати процес негайно. Це зроблено для того, щоб програма могла знищити сліди своєї роботи, перш ніж вона буде завершена. Насправді, деякі програми взагалі не можна перервати в такий спосіб.

Переведення у фоновий режим та знищення завдань

Почнемо з простого прикладу. Розглянемо команду yes, яка на перший погляд може здатися марною. Ця команда посилає нескінченний потік рядків, що складаються із символу y на стандартний висновок. Подивимося, як працює ця команда:

/home/larry# yes y y y y y

Послідовність таких рядків продовжуватиметься нескінченно. Знищити цей процес можна, відправивши йому сигнал переривання, тобто натиснувши Ctrl -C. Вчинимо тепер інакше. Щоб на екран не виводилася ця нескінченна послідовність, перенаправимо стандартний висновок команди yes на /dev/null . Як ви, можливо, знаєте, пристрій /dev/null діє як «чорна діра»: всі дані, надіслані в цей пристрій, зникають. За допомогою цього пристрою дуже зручно позбавлятися занадто багато висновку деяких програм.

/home/larry# yes > /dev/null

Тепер на екран нічого не виводиться. Проте запрошення командної оболонки також повертається. Це відбувається тому, що команда yes все ще працює і надсилає свої повідомлення, що складаються з літер y на /dev/null . Знищити це завдання також можна, надіславши йому сигнал переривання.

Допустимо тепер, що ви хочете, щоб команда yes продовжувала працювати, але при цьому і запрошення командної оболонки має повернутися на екран, так щоб ви могли працювати з іншими програмами. Для цього можна команду yes перевести у фоновий режим, і вона працюватиме там, не спілкуючись з вами.

Один спосіб перевести процес у фоновий режим – приписати символ & до кінця команди. Приклад:

/home/larry# yes > /dev/null & + 164 /home/larry#

Повідомлення є номер завдання(job number) для yes. Командна оболонка присвоює номер завдання кожному завдання, що виконується. Оскільки yes є єдиним завданням, що виконується, йому присвоюється номер 1. Число 164 є ідентифікаційним номером, відповідним даному процесу (PID ), і цей номер також дано процесу системою. Як ми побачимо далі, до процесу можна звертатися, вказуючи обидва ці номери.

Отже, тепер у нас є процес команди yes, що працює у фоні, і безперервно посилає потік з літер y на пристрій /dev/null. Для того, щоб дізнатися про статус цього процесу, потрібно виконати команду jobsяка є внутрішньою командою оболонки.

/home/larry# jobs + Running yes >/dev/null & /home/larry#

Ми бачимо, що ця програма справді працює. Для того, щоб дізнатися про статус завдання, можна також скористатися командою psЯк це було показано вище.

Для того, щоб передати процесу сигнал (найчастіше виникає потреба перерватироботу завдання) використовується утиліта kill. Як аргумент цієї команді дається або номер завдання, або PID . Необов'язковий параметр – номер сигналу, який потрібно відправити процесу. За замовчуванням надсилається сигнал TERM. У цьому випадку номер завдання був 1, так що команда kill %1перерве роботу завдання. Коли до завдання звертаються за номером (а не PID ), тоді перед цим номером у командному рядку потрібно поставити символ відсотка («% »).

Тепер введемо команду jobsзнову, щоб перевірити результат попередньої дії:

/home/larry# jobs Terminated yes >/dev/null

Фактично завдання знищено, і при введенні команди jobs наступного разу на екрані про нього не буде жодної інформації.

Знищити завдання можна також, використовуючи ідентифікаційний номер процесу (PID). Цей номер поряд з ідентифікаційним номером завдання вказується під час старту завдання. У нашому прикладі значення PID було 164, тому команда kill 164була б еквівалентна команді kill %1. При використанні PID як аргумент команди kill вводити символ «%» не потрібно.

Призупинення та продовження роботи завдань

Запустимо спочатку процес командою yes на передньому плані, як це робилося раніше:

/home/larry# yes > /dev/null

Як і раніше, оскільки процес працює на передньому плані, запрошення командної оболонки на екран не повертається.

Тепер замість перервати завдання комбінацією клавіш Ctrl -C, завдання можна призупинити(Suspend, буквально - підвісити), відправивши йому сигнал STOP. Для припинення завдання треба натиснути відповідну комбінацію клавіш, зазвичай це Ctrl -Z .

/home/larry# yes > /dev/null Ctrl -Z+ Stopped yes >/dev/null /home/larry#

Зупинений процес просто не виконується. Нею не витрачаються обчислювальні ресурси процесора. Зупинене завдання можна запустити виконувати з тієї ж точки, начебто воно і не було зупинено.

Для відновлення виконання завдання на передньому плані можна використати команду fg(Від слова foreground - передній план).

/home/larry# fg yes >/dev/null

Командна оболонка ще раз виведе на екран назву команди, тому користувач знатиме, яке саме завдання він в даний момент запустив на передньому плані. Припинимо це завдання ще раз натисканням клавіш Ctrl -Zале цього разу запустимо його у фоновий режим командою bg(Від слова background - фон). Це призведе до того, що цей процес буде працювати так, якби при його запуску використовувалася команда з символом & в кінці (як це робилося в попередньому розділі):

/home/larry# bg + yes $>$/dev/null & /home/larry#

У цьому запрошення командної оболонки повертається. Зараз команда jobsмає показувати, що процес yesдійсно зараз працює; цей процес можна знищити командою killяк це робилося раніше.

Щоб призупинити завдання, що працює у фоновому режимі, не можна скористатися комбінацією клавіш Ctrl -Z. Перш ніж зупиняти завдання, його потрібно перевести на передній план командою fgі лише потім призупинити. Таким чином, команду fgможна застосовувати до призупинених завдань, або до завдання, що працює у фоновому режимі.

Між завданнями у фоновому режимі та зупиненими завданнями є велика різниця. Зупинене завдання не працює – на нього не витрачаються обчислювальні потужності процесора. Це завдання не виконує жодних дій. Зупинене завдання займає деякий обсяг оперативної пам'яті комп'ютера, через деякий час ядро ​​відкачає цю частину пам'яті жорсткий диск « до вимоги». Навпаки, завдання у фоновому режимі виконується, використовує пам'ять і здійснює деякі дії, які, можливо, вам потрібні, але ви можете працювати з іншими програмами.

Завдання, що працюють у фоновому режимі, можуть намагатись виводити деякий текст на екран. Це заважатиме працювати над іншими завданнями.

/home/larry# yes &

Тут стандартний висновок не був перенаправлений на пристрій /dev/null, тому на екран виводиться нескінченний потік символів y. Цей потік неможливо буде зупинити, оскільки комбінація клавіш Ctrl -Cне впливає на завдання у фоновому режимі. Для того, щоб зупинити цю видачу, треба використовувати команду fg, яка переведе завдання на передній план, а потім знищити завдання комбінацією клавіш Ctrl -C .

Зробимо ще одне зауваження. Зазвичай командою fgта командою bgвпливають на ті завдання, які були припинені останніми (ці завдання будуть позначені символом + поруч із номером завдання, якщо ввести команду jobs). Якщо в той же час працює одне або кілька завдань, завдання можна поміщати на передній план або у фоновий режим, задаючи як аргументи команди fgабо команди bgїхній ідентифікаційний номер (job ID). Наприклад, команда fg %2поміщає завдання номер 2 на передній план, а команда bg %3поміщає завдання номер 3 у фоновий режим. Використовувати PID як аргументи команд fgі bgне можна.

Більше того, для перекладу завдання на передній план можна вказати його номер. Так, команда %2 буде еквівалентна команді fg %2 .

Важливо пам'ятати, що функція управління завданням належить оболонці. Команди fg , bgі jobsє внутрішніми командамиоболонки. Якщо з певної причини ви використовуєте командну оболонку, яка не підтримує функції управління завданнями, то ви в ній цих (і подібних) команд не знайдете.