1.Теоретические відомості
Щоб ефективно управляти процесами і сервісами ОС Linux необхідно добре розуміти, що представляє собою
процес з точки зору ОС, і яким чином в ОС відбувається взаємодія між різними типами процесів.
Процес - це об'єкт ОС Linux, який складається з адресного простору пам'яті і набору структур даних.
По суті, процес це запущена програма або служба.
Кожен запущений процес в ОС Linux може породити додаткові процеси. Процес, що запустив новий процес називається
продительским процесом. Новий процес по відношенню до створив його процесу називається дочірнім.
Процеси - це не те ж саме, що завдання: процеси є частиною
поперационной системи, тоді як про завдання відомо тільки
пкомандному процесору, в якому вони виконуються. Працююча
ппрограмма укладає в собі один або більше процесів; завдання
псостоит з однієї або більше програм, які виконуються у вигляді команд
пкомандного процесора.
Кожен процес ОС Linux характеризується набором атрибутів, який відрізняє даний процес від всіх інших процесів.
пК таких атрибутів відносяться:
* Ідентифікатор процесу (PID) . Кожен процес в системі має унікальний
ідентифікатор. Кожен новий запущений процес отримує номер на одиницю більше
ппредыдущего.
* Ідентифікатор батьківського процесу (PPID). Даний атрибут процес отримує під
час свого запуску і використовується для отримання статусу батьківського процесу.
* Реальний і ефективний ідентифікатори користувача (UID,EUID) і групи (GID,
EGID). Дані атрибути процесу говорять про його приналежність до конкретного
користувачеві і групі. Реальні ідентифікатори збігаються з ідентифікаторами користувача,
який запустив процес, і групи, до якої він належить.
Ефективні - від чийого імені був запущений процес. Права доступу процесу до ресурсів ОС Linux
ефективними ідентифікаторами. Якщо на виконуваному файлі програми встановлено спеціальний біт
SGID або SUID, то процес даної програми буде володіти правами доступу власника виконуваного файлу.
Для управління процесом (наприклад, kill) використовуються реальні
ідентифікатори. Всі ідентифікатори передаються від батьківського до дочірнього процесу.
Для перегляду даних атрибутів можна скористатися командою ps,
задавши бажаний формат відображення колонок.
* Пріоритет або динамічний пріоритет (priority) і відносний або статичний (nice) пріоритет процесу.
Статичний пріоритет або nice-пріоритет лежить в діапазоні від -20 до 19, типово використовується значення 0.
Значення -20 відповідає найбільш високого пріоритету, nice-пріоритет не змінюється планувальником,
він успадковується від батьків або його вказує автор.
Динамічний пріоритет використовується планувальником для планування виконання процесів. Цей пріоритет зберігається в полі prio
структури task_struct процесу. Динамічний пріоритет обчислюється виходячи зі значення параметра пісе для даної задачі
шляхом обчислення надбавки або штрафу, залежно від інтерактивності завдання.
Користувач має можливість змінювати тільки статичний пріоритет процесу. При цьому підвищувати пріоритет може тільки root.
В ОС Linux існують дві команди управління пріоритетом процесів: nice і renice.
* Стан процесу. В ОС Linux кожен процес обов'язково знаходиться в одному з перерахованих нижче станів і може бути
переведений з одного стану в інше системою або командами користувача.
Розрізняють наступне стану процесів:
TASK_RUNNING - процес готовий до виконання або виконується (runnable). Позначається символом R.
TASK_INTERRUPTIBLE - чекаючий процес (sleeping). Цей стан означає, що процес ініціалізував виконання
якої системної операції і чекає її завершення. До таких операцій відносяться введення/висновок, завершення дочірнього процесу
пі т.д. Процеси з таким станом позначаються символом S.
TASK_STOPPED - виконання процесу зупинено (stopping). Будь-який процес можна зупинити. Це може робити як система,
ptak і користувач. Стан такого процесу позначається символом Т.
TASK_ZOMBIE - завершився процес (zombie). Процеси даного стану виникають у разі, коли батьківський процес
не чекаючи завершення дочірнього процесу, продовжує паралельно працювати. Процеси з таким станом позначаються символом Z.
пЗавершившиеся процеси більше не виконуються системою, але далі продовжують споживати її не обчислювальні ресурси.
TASK_UNINTERRUPTIBLE -неперерваний процес (uninterruptible). Процеси в цьому стані очікують завершення операції
введення - виведення з прямим доступом в пам'ять. Такий процес не можна завершити, поки не завершиться операція введення/виводу.
Процеси з таким станом позначаються символом D. Стан аналогічно TASK_INTERRUPTIBLE, за винятком того, що процес
не відновлює виконання при отриманні сигналу. Використовується у випадку, коли процес повинен чекати безперервно або
коли очікується, що певна подія може виникати досить часто. Так як завдання в цьому стані не відповідає
пна сигнали, TASK_UNINTERRUPTIBLE використовується менш часто, ніж TASK_INTERRUPTIBLE.
Типи процесів
пВ Linux процеси поділяються на три типи:
- Системні процеси - є частиною ядра і завжди розташовані в оперативній пам'яті. Системні процеси не мають
псоответствующих їм програм у вигляді виконуваних файлів і запускаються при ініціалізації ядра системи. Виконувані інструкції і дані
пэтих процесів знаходяться в ядрі системи, таким чином, вони можуть викликати функції і звертатися до даних, недоступним для інших
ппроцессов. Системними процесами, наприклад, є: shed (диспетчер підкачки), vhand (диспетчер сторінкового заміщення), kmadaemon
(диспетчер пам'яті ядра).
- Демони - це неінтерактівние процеси, які запускаються звичайним способом - шляхом завантаження в пам'ять відповідних їм
ппрограмм (виконуваних файлів), і виконуються у фоновому режимі. Зазвичай демони запускаються при ініціалізації системи
(але після ініціалізації ядра) та забезпечують роботу різних підсистем: системи термінального доступу, системи друку, з
пистемы мережевого доступу і мережевих послуг, поштовий сервер dhcp сервер і т. п. Демони не пов'язані ні з одним користувача
псеансом роботи і не можуть безпосередньо управлятися користувачем. Більшу частину часу демони чекають поки той
пили інший процес запросить певну послугу, наприклад, доступ до файлового архіву або друк документа.
- Прикладні (користувача) процеси.
пК прикладних процесів відносяться всі інші процеси, запущені в системі. Як правило, це процеси, породжені в
рамках користувальницького сеансу роботи.
пНапример, команда ls породить відповідний процес цього типу. Найважливішим прикладним процесом є командний інтерпретатор
(shell), який забезпечує вашу роботу в LINUX. Він запускається відразу ж після реєстрації в системі.
пПрикладные процеси linux можуть виконуватися як в інтерактивному, так і у фоновому режимі, але в будь-якому випадку час їх життя
(і виконання) обмежено сеансом роботи користувача. При виході з системи всі прикладні процеси будуть знищені.
Ієрархія процесів
пВ Linux реалізована чітка ієрархія процесів в системі. Кожен процес в системі має всього одного з батьків і може мати один або
пболее породжених процесів.
Рис. 3.1 - Фрагмент ієрархії процесів
На останній фазі завантаження ядро підіймається кореневу файлову систему і формує середовище виконання нульового процесу, створюючи простір
ппроцесса, инициализируя нульову точку входу в таблиці процесу і роблячи кореневий каталог поточним для процесу. Коли формування середовища виконання процесу закінчується, система виповнюється вже у вигляді нульового процесу. Нульовий процес "гілкується", запускаючи fork прямо з ядра, оскільки сам процес виконується в режимі ядра. Код, що виконується породженим процесом 1, включає в себе виклик системної функції exec, запускі на виконання програму з файлу/etc/init". На відміну від нульового процесу, який є процесом системного рівня, що виконуються в режимі ядра, процес 1 відноситься до користувача рівня. Зазвичай процес 1 іменується процесом init, оскільки він відповідає за ініціалізацію нових процесів.
пНа самом деле ви можете помістити будь-яку програму в /sbin/init і ядро запустить її як тільки закінчить завантажуватися.
пЗадачей init"а є запуск всього іншого потрібним чином.
Init читає файл /etc/inittab, в якому містяться інструкції для подальшої роботи. Першою інструкцією, звичайно, є запуск сценарію ініціалізації. У системах, заснованих на Debian, скриптом ініціалізації буде /etc/init.d/rcS, у Red Hat - /etc/rc.d/rc.sysinit. Це те місце, де відбувається перевірка і монтування файлових систем (/etc/fstab), установка годин системного часу, включення своп розділу, присвоєння імені хоста і т.д.
пДалее буде викликаний наступний скрипт, який переведе нас на "рівень запуску" за замовчуванням.
це означає просто деякий набір демонів, які повинні бути запущені.
Syslogd (/etc/init.d/syslogd) - скрипт, який відповідає за запуск і зупинка системного логгера (система журнальної реєстрації подій
SYSLOG, дозволяє записувати системні повідомлення у файли журналів /var/log).
Xined-Демон Інтернет-служб, управляє сервісами для інтернету. Демон прослуховує сокети і якщо в якомусь з них є повідомлення
попределяет якого сервісу належить даний сокет і викликає відповідну програму для обробки запиту.
crond - Демон cron відповідає за перегляд файлів crontab і виконання, внесених до нього команд у вказаний час для опредленного
ппользователя. Програма crontab(1) спілкується з crond через файл cron.update, який повинен знаходитись разом з рештою файлів каталогу
crontab, як правило - /var/spool/cron/crontabs.
Останнім важливим дією init є запуск деякої кількості getty. Mingetty - віртуальні термінали, призначенням яких
пявляется спостереження за консолями користувачів.
getty запускає програму login - початок сеансу роботи користувача в системі. Завдання login"а - реєстрація користувача в системі.
пА вже після успішної реєстрації найчастіше завантажуватись командний інтерпретатор користувача (shell), наприклад, bash, вірніше
після реєстрації користувача вантажиться програма, вказана для даного користувача в файлі /etc/passwd (у більшості випадків це bash).
2. Запуск процесів
Існує два шляхи запуску процесів в залежності від типу процесу.
Для користувача процесів запуск здійснюється в інтерактивному режимі шляхом введення довільній команди або запуску
ппроизвольного скрипта. Для системних процесів і демонів використовуються инициализационные скрипти (init-скрипти). Дані скрипти
писпользуется процесом init для запусків інших процесів при завантаженні ОС. Инициализационные скрипти зберігаються у каталозі /etc. У даному
пкаталоге існують підкаталоги, іменовані rcO.d - rc6.d, кожен з яких асоційований з певним рівнем виконання
(runlevel). У кожному з цих каталогів знаходяться символьні посилання на инициализационные скрипти, що знаходяться безпосередньо в каталозі
/etc/rc.d/init.d .
Слід зауважити, що в каталозі /etc/init.d присутні жорсткі посилання на скрипти каталогу /etc/rc.d/init.d, тому при зміні
пскриптов в цих каталогах змінені дані відображаються однаково незалежно від шляху до файлу скрипта.
Перегляд init-скриптів
Bee init-скрипти можливо повторно запускати або зупиняти, тим самим керуючи статусом сервісу, до якого вони належать.
пЗапуск даних скриптів здійснюється з командного рядка і має наступний синтаксис:
/etc/init.d/script-name start|stoplrestart|condrestart|status|reload
пЗдесь як script-name використовується конкретне ім'я init-скрипта, а в якості аргументів можуть виступати наступні значення:
* start (Запуск сервісу);
* stop (Зупинка сервісу);
* restart (Зупинка і подальший запуск сервісу);
* condrestart (Умовна зупинка і наступний запуск сервісу);
* status (Отримання статусу стану сервісу);
* reload (Повторне зчитування конфігураційного файлу сервісу).
пНапример, для умовного перезапуску сервісу sshd використовується наступна команда:
[root@rhe!5 ~]# /etc/init.d/sshd condrestart
Stopping sshd: [ ok ]
Starting sshd: [ ok ]
пУсловный перезапуск сервісу sshd.
пВ разі використання аргументу condrestart перезапуск сервісу буде здійснено тільки у тому випадку, якщо вже сервіс працює
пв системі.
В ОС Linux для управління сервісами, окрім безпосереднього звернення до файлу init-скрипта, існує спеціальна
команда service (другий спосіб), в якості аргументу якій необхідно вказати аргументи аналогічні тим, що використовуються при безпосередньому
пзапуске демонів через init-скрипты:
[root@rhel5 ~]# service sshd reload
Reloading sshd: [ ok ]
пИспользование команди service.
пВ даному прикладі здійснюється повторне зчитування конфігураційного файлу сервісу sshd.
Однак керувати демонами у більшості випадків може тільки root.
Команди запуску процесів
Команда niceвикористовується для запуску ще не запущених процесів з заданим пріоритетом.
Команда renice використовується для зміни пріоритету вже запущених процесів.
3. Моніторинг процесів
пДля перегляду запущених процесів в ОС Linux використовуються утиліти
- - Вивести список процесів
- ps - Інтерактивно спостерігати за процесами (в реальному часі)
- uptime - Подивитися завантаження системи
- w, Вивести список активних процесів для всіх користувачів
- free - Вивести обсяг вільної пам'яті
- pstree - Відображає всі запущені процеси у вигляді ієрархії
При виконанні top у верхній частині вікна відображається астрономічне час, що минув з моменту запуску системи,
пчисло користувачів в системі, кількість запущених процесів і кількість процесів, що знаходяться в різних станах,
пданные про використання ЦП, пам'яті і свопу. А далі йде таблиця, що характеризує окремі процеси.
пЧисло рядків, що відображаються в цій таблиці, визначається розміром вікна: скільки рядків поміщається, стільки і виводиться.
пСодержимое вікна оновлюється кожні 5 секунд. Список процесів може бути відсортований за свого часу ЦП (за замовчуванням),
ппо використання пам'яті, за PID, за часом виконання. Перемикати режими відображення можна за допомогою команд, які програма
top сприймає. Це наступні команди (просто натискайте відповідні клавіші, тільки з урахуванням регістру, тобто разом з клавішею
Shift):
* Shift+N - сортування по PID;
* Shift+A - сортувати процеси за віком;
* Shift+P - сортувати процеси щодо використання ЦП;
* Shift+M - сортувати процеси з використання пам'яті;
* Shift+T - сортування по часу виконання.
пКроме команд, що визначають режим сортування, команда top сприймає ще ряд команд,
дозволяють управляти процесами в інтерактивному режимі.
пС допомогою команди можна завершити деякий процес (його PID буде запитано), а за допомогою команди R> <можна
ппереопределить значення nice для деякого процесу. Таким чином, ці дві команди аналогічні командам kill і renice.
Вивід команди ps схожий з висновком команди top, однак він відображає статичний
пснимок процесів.
За умовчанням, команда ps виводить тільки інформацію про процеси, запущені в поточній сесії інтерпретатора командного bash.
пДля виводу інформації з усіх процесів необхідно ввести команду ps з ключем-е. Для відображення бажаних полів необхідно
пввести
пкоманду ps з ключем-про поле1,поле2,... , де перераховуються через кому поля, які необхідно відобразити.
Для більш наочного розуміння взаємозв'язку між процесами в ОС Linux існує команда pstree,
пкоторая відображає всі запущені процеси у вигляді ієрархії, за якою можна визначити взаємозв'язок між процесами.
4. Управління процесами
До команд управління процесами відносяться команди nice
renice , описані вище, а також:
- kill Завершити процес (або послати йому сигнал).
- pkill - Відправлення сигналу процесу по імені або іншому атрибуту.
- killall Завершити процес по імені.
- pgrep - Переглядає запущені процеси, і виводить на стандартний вивід.
псписок ідентифікатори процесів, які відповідають критеріям відбору. Всі критерії повинні збігатися.
- sleep - Зупиняє виконання на вказану КІЛЬКІСТЬ секунд.
- fuser - Определенея того, який процес тримає відкритим якийсь файл або сокет.
команда kill посилає сигнал процесу з вказаним ідентифікатором (pid).
пИспользуется в наступній формі:
kill [номер] pid
Тут pid - це ідентифікатор процесу, яким надсилається сигнал, а номер - номер сигналу, який надсилається процесу.
пПослать сигнал (якщо у вас немає повноважень суперкористувача) можна тільки процесу, у якого ефективний ідентифікатор користувача
псовпадает з ідентифікатором користувача, посилає сигнал. Якщо параметр-номер відсутній, то надсилається сигнал SIGTERM,
пзазвичай має номер 15, і реакція на нього за замовчуванням - завершити роботу процесу, який отримав сигнал. (детальніше див.
kill).r
Щоб завершити який небудь процес, потрібно надіслати йому сигнал за допомогою команди kill. Для цього необхідно
пузнать Pid процесу за допомогою команди ps (наприклад, Pid процесу дорівнює 11839) та надіслати процесу сигнал на завершення, наприклад сигнал
SIGKILL:
kill -9 11839
або kill-SIGKILL 11839
або kill-KILL 11839
Що ж таке сигнали?
пСигналы - це програмні переривання. Сигнали в ОС Linux використовуються як засоби синхронізації і взаємодії процесів і ниток.
пСигнал є повідомленням, яке система посилає процесу або один процес посилає іншого.
пС точки зору користувача процесом отримання сигналу виглядає як виникнення переривання. Процес припиняє своє виконання,
пі керування передається механізму обробки сигналу (обробщику). Після закінчення обробки сигналу процес може відновити
псвое виконання з тієї точки, на якій він був перерваний.
насамперед, кожен сигнал має власне ім ’ я та номер. Імена всіх сигналів починаються з послідовності SIG.
пНапример, SIGALRM - генерується, коли таймер, встановленої функцією alarm(), відміряє вказаний проміжок часу.
Linux підтримує 31 сигнал (номери від 1 до 31).
Сигнали можуть породжуватися різними умовами:
1. Генеруватися терміналом, при натисканні певної комбінації клавіш, наприклад, натискання
Ctrl+C генерує сигнал SIGINT, таким чином можна перервати виконання програми, яка вийшла з під контролю;
2. Апаратні помилки - поділ на 0, помилка доступу до пам'яті та інші - також призводять до генерації сигналів.
пЭти помилки зазвичай виявляються апаратним забезпеченням, яка сповіщає ядро про їх появу.
ппісля цього ядро генерує відповідний сигнал і передає його процесу, який виконувався в момент появи помилки.
пНапример, сигнал SIGSEGV надсилається процесу у разі спроби звернення до неправильного адресою в пам'яті.
3. Іншим процесом (у тому числі і ядром і системним процесом), виконали системний виклик передачі сигналу kill();
4. При виконанні команди kill.
Передачу сигналів процесу у випадках його створення будь-яким іншим процесом, можна розглядати як реалізацію
псигнальных засобів зв'язку.
пВ разі отримання сигналу процес може запросити ядро виконати одну з трьох реакції на сигнал:
1. Примусово проігнорувати сигнал (практично будь-який сигнал може бути проігноровано, крім SIGKILL і SIGSTOP).
2. Провести обробку сигналу за замовчуванням: проігнорувати, зупинити процес, перевести в стан очікування до отримання
пдругого спеціального сигналу або завершити роботу.
3. Перехопити сигнал (виконати обробку сигналу, специфіковану користувачем).
Типи сигналів і способи їх виникнення в системі жорстко регламентовані.
пТипы сигналів прийнято ставити числовими номерами, в діапазоні від 1 до 31 включно, але при програмуванні часто використовуються
псимвольные імена сигналів, визначені в системних включаються файлах.
У другій частині лабораторних робіт (розробка системних програм) ми більш докладно познайомимося з механізмом роботи
псигналов, навчимося їх перехоплювати. В даній роботі необхідно навчитися посилати сигнали процесів за допомогою команд.
докладніше опис типів сигналів див. в описі команди kill.
5. Управління завданнями
До команд управління завданнями відносяться:
- jobs - Перераховує ваші завдання.
- & - Виконати завдання у фоновому режимі.
- Ctrl+Z - Призупинити виконання поточної (інтерактивної) завдання.
- suspend - Призупинити командний процесор.
- fg Перевести завдання в інтерактивний режим виконання.
- bg Перевести припинену завдання у фоновий режим виконання.
пвсі командні оболонки Linux мають можливість
пуправления завданнями: можливість виконувати програми у фоновому
(невидима багатозадачність) і інтерактивному (щоб програма ви-
пполнялась як активний процес у сеансі вашого командного
ппроцессора) режимах.
Завдання (job) - це просто робоча одиниця
пкомандного процесора.
пКогда ви запускаєте команду, ваш поточний командний
ппроцессор визначає її як завдання і стежить за нею. Коли команда
пвыполнена, відповідне завдання зникає. Завдання знаходяться на
пболее високому рівні, ніж процеси Linux; операційна система
Linux нічого про них не знає. Вони є лише елементами
пкомандного процесора. Ось деякі важливі терміни з
плексикона завдань.
- інтерактивне завдання (foreground job) - що Виконується в
пкомандном процесорі, що займає сеанс командного процесора,
ptak що ви не можете виконати іншу команду.
- фонове завдання (background job) - що Виконується в командному процесорі, але не займає сеанс
пкомандного процесора, так що ви можете виконати іншу
пкоманду в цьому ж командному процесорі.
- призупинити (suspend) - Тимчасово призупинити інтерактивний процес.
- відновити (resume) - Повернутися до вьполнению discontinued завдання.
фон зручно відправляти завдання, які не потребують втручання користувача. Прикладами таких завдань можуть служити
пкомпиляция програмного забезпечення і складні обчислювальні програми. Для цих додатків важливо мінімізувати
псуммарное час виконання в системі, завантаженої іншими процесами, породженими, зокрема, інтерактивними завданнями.
пякщо ви запустили з командного процесора команду
пинтерактивном режимі і хочете негайно припинити виконання команди,
пвведіть Ctrl-З. Командний процесор сприйме Ctrl-З
пяк "зупинити виконання поточної задачі негайно". Тому,
пякщо ви виводите дуже довгий файл (скажімо, командою cat) та
пхочете зупинити висновок, натисніть Ctrl-З. Насправді поточної задачі
ппо натискання Ctrl-З відправиться сигналу SIGINT.
Щоб припинити виконання програми, що працює в
пфоновом режимі, ви можете перевести її в інтерактивний режим
пс допомогою команди fg і потім натиснути Ctrl-З, або використовувати команду kill.