Чи бажаєте ви, щоб ваша програма Linux автоматично запускалася під час завантаження системи? Система керування службами systemd надає для цього зручний механізм, який підтримується більшістю сучасних дистрибутивів Linux, зокрема Ubuntu. У цьому керівництві ми розглянемо, як створити власну службу, яка інтегрується з systemd та взаємодіє з системним журналом.
У цьому посібнику детально описано процес налаштування системної служби, яка автоматично запускатиметься під час кожного старту вашої системи. Для запуску графічних програм під час входу користувача скористайтеся інструментами керування автозапуском, що надаються вашим середовищем робочого столу.
Запуск програм при завантаженні системи
Часто, встановлюване програмне забезпечення автоматично інтегрується в процес завантаження Linux, що забезпечує його автоматичний запуск при кожному ввімкненні комп’ютера. Ви також можете легко налаштувати таку поведінку для власних програм, сценаріїв або будь-якого іншого програмного забезпечення, встановленого на вашому комп’ютері.
Запуск програм при старті системи контролюється за допомогою systemd, що є менеджером системи та служб. Systemd є першим процесом, який запускається при старті системи та має ідентифікатор процесу (PID) 1. Всі інші процеси, що виконуються на вашому комп’ютері, запускаються безпосередньо systemd або процесами, які вже ініційовані systemd.
Програми, що працюють у фоновому режимі, часто називають демонами або службами. Літера “d” в назві systemd означає daemon. В рамках цього посібника ми створимо приклад служби, яка відповідатиме наступним критеріям:
- Інтегрована з systemd через службовий файл юніту.
- Автоматично запускається при завантаженні системи.
- Керується за допомогою systemctl, інтерфейсу керування systemd.
- Здатна записувати інформацію в системний журнал.
Створення програмної служби
Перш за все нам потрібна програма, яку systemd буде запускати. Для цієї мети ми створимо простий скрипт під назвою “htg.sh”. У цьому прикладі ми використовуватимемо текстовий редактор Gedit, але ви можете застосувати будь-який інший текстовий редактор на ваш вибір.
touch htg.sh
gedit htg.sh
Відкриється вікно редактора Gedit. Скопіюйте та вставте наступний код у відкритий редактор:
#!/bin/bash echo "htg.service: ## Starting ##" | systemd-cat -p info while : do TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') echo "htg.service: timestamp ${TIMESTAMP}" | systemd-cat -p info sleep 60 done
Збережіть внесені зміни та закрийте редактор.
Скрипт не виконує складних дій, але є кілька важливих аспектів, на які варто звернути увагу:
- Два рядки з виводом передаються через systemd-cat, інструмент, який перенаправляє вивід програми до системного журналу. Записи в журналі мають пріоритет, і в нашому випадку ми використовуємо опцію “-p” для вказівки інформаційного (info) рівня повідомлень, оскільки вони не є критичними помилками чи попередженнями.
- Скрипт містить нескінченний цикл while.
- Змінна TIMESTAMP встановлюється на поточну дату та час, які потім форматуються та відправляються до журналу.
- Далі скрипт переходить у стан сну на 60 секунд, після чого цикл повторюється, записуючи повідомлення з відміткою часу до журналу щохвилини.
Тепер нам потрібно скопіювати цей скрипт до каталогу /usr/local/bin.
sudo cp htg.sh /usr/local/bin
І зробити його виконуваним:
sudo chmod +x /usr/local/bin/htg.sh
Створення файлу службового блоку
Кожна програма, що запускається systemd, повинна мати файл визначення, так званий файл службового блоку. Цей файл містить атрибути, які systemd використовує для пошуку та запуску програми, а також для визначення її поведінки.
Нам потрібно створити файл блоку для нашої нової служби, але спочатку варто перевірити, чи жоден з існуючих файлів юнітів не має імені, яке ми плануємо використовувати.
sudo systemctl list-unit-files --type-service
Переглядаючи цей список, відсортований за алфавітом, можна переконатися, що бажане ім’я не використовується.
Ми назвемо нашу службу “htg.service”. Жоден інший файл блоку не має такого імені, отже ми можемо продовжити створення нашого власного.
sudo gedit /etc/systemd/system/htg.service
Відкриється редактор gedit. Скопіюйте та вставте наступний код в редактор:
[Unit] Description=Приклад сервісу від How-To Geek Wants=network.target After=syslog.target network-online.target [Service] Type=simple ExecStart=/usr/local/bin/htg.sh Restart=on-failure RestartSec=10 KillMode=process [Install] WantedBy=multi-user.target
Збережіть зміни та закрийте редактор.
Розглянемо значення кожного з цих параметрів. Хоча деякі з них є стандартними, наш простий сервіс не потребує більшості з них, проте ми їх пояснимо для кращого розуміння:
- Description: текстовий опис вашої служби.
- Wants: вказує на те, що наша служба “бажає”, але не вимагає, щоб мережа була доступною перед її запуском.
- After: перелік підрозділів, які повинні успішно запуститися перед запуском цієї служби, якщо вони ще не активовані.
- Type: встановлено в “simple”, що означає, що systemd вважатиме службу запущеною після того, як процес, визначений ExecStart, буде відгалужений.
- ExecStart: шлях до виконуваного процесу.
- Restart: визначає, коли та чи потрібно перезапускати службу. Ми встановили значення “on-failure”, тобто служба перезапуститься в разі збою.
- RestartSec: визначає час очікування перед спробою перезапустити службу в секундах.
- KillMode: визначає, як systemd повинен завершувати процес, коли ми запитуємо зупинку служби. Ми встановили значення “process”, що змушує systemd використовувати сигнал SIGTERM лише для основного процесу. Якщо б наша служба була складнішою програмою, а не простим скриптом, ми б встановили “mixed”, щоб гарантувати зупинку всіх дочірніх процесів.
- WantedBy: ми встановили “multi-user.target”, що вказує на запуск служби, коли система досягає стану, де декілька користувачів можуть увійти, незалежно від наявності графічного інтерфейсу.
Файл блоку не обов’язково повинен бути виконуваним, проте дозволи на файл блоку повинні обмежувати доступ для редагування. Це важливо, щоб уникнути випадкового чи навмисного внесення змін у файл блоку, які можуть призвести до виконання іншої програми.
Наступна команда надасть права на читання та запис власнику, а права на читання для групи. Інші користувачі не матимуть жодних прав.
sudo chmod 640 /etc/systemd/system/htg.service
Ми можемо перевірити синтаксис нашого файлу блоку, навіть якщо служба ще не запущена. Про будь-які помилки буде повідомлено (частина “.service” є необов’язковою для більшості команд).
systemctl status htg.service
Відсутність повідомлень про помилки означає, що наш файл юніту є синтаксично правильним.
Запуск служби
Після додавання нового файлу блоку або редагування існуючого, потрібно сповістити systemd про необхідність перевантажити визначення файлів блоків.
sudo systemctl daemon-reload
Щоб служба автоматично запускалася при завантаженні, її необхідно ввімкнути:
sudo systemctl enable htg
Ввімкнення служби не запускає її безпосередньо, а лише налаштовує її для запуску під час завантаження. Для запуску служби негайно, потрібно використовувати systemctl з опцією start.
sudo systemctl start htg
Перевірка роботи служби
Після запуску служби вручну або після перезавантаження комп’ютера, можна перевірити, чи працює вона правильно.
sudo systemctl status htg.service
Статус служби відображається на екрані.
Зелена крапка вказує на те, що служба працює коректно.
Ім’я служби “htg.service”, а довгий опис відповідає тому, який ми вказали у файлі блоку.
Зображається шлях до файлу блоку, що завантажено “/etc/systemd/system/htg.service”.
Служба активна, і вказується час її запуску.
Її PID – 7762.
Зі службою пов’язано два завдання.
Всього 928 Кібібайт пам’яті використовуються службою.
Група керування включає скрипт “htg.sh” та команду sleep, яку запустив “htg.sh”. Більшу частину часу команда sleep буде виконувати роботу для цієї служби.
Також відображаються останні 10 записів в журналі, згенерованих службою. Усі вони мають різницю в одну хвилину.
Зупинка та вимкнення служби
Якщо необхідно зупинити службу, можна скористатися наступною командою:
sudo systemctl stop htg.service
Це зупинить службу, але не завадить їй перезапуститися під час наступного завантаження комп’ютера. Щоб відключити автозапуск служби, потрібно її вимкнути:
sudo systemctl disable htg.service
Якщо служба наразі запущена, ця команда її не зупинить. Вона просто сповістить systemd не запускати службу під час наступного перезавантаження.
Якщо ви хочете зупинити службу та запобігти її запуску під час завантаження, скористайтеся обома командами.
Порада
Перед тим, як намагатися запустити програму як службу, переконайтеся, що вона працює належним чином.