Як запустити програму Linux під час запуску за допомогою systemd

Потрібно запустити програму Linux під час завантаження? Програмне забезпечення systemd надає спосіб зробити це на будь-якому дистрибутиві Linux за допомогою systemd, яких сьогодні більшість, включаючи Ubuntu. Ми проведемо вас через процес створення інтегрованої служби — і вона навіть спілкується з журналом.

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

Запуск програм під час запуску

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

Програмами, які запускаються під час запуску, керує systemd, the система і сервіс менеджер. systemd — це перший процес, який запускається під час запуску. Воно завжди було ідентифікатор процесу (PID) 1. Кожен інший процес, що виконується на вашому комп’ютері, запускається системою systemd або процесом, який вже запущений systemd.

Програми, які працюють у фоновому режимі, називаються демони або послуги. «d» в кінці systemd означає daemon. У цій статті ми створимо приклад служби. Щоб поставити галочки, наш сервіс має бути:

Інтегровано з systemd через файл службового блоку
Запускається при запуску
Керується за допомогою systemctl, the інтерфейс керування для 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

Збережіть зміни та закрийте редактор.

  Як використовувати pushd і popd в Linux

Сценарій не робить багато, але є кілька моментів, на які варто звернути увагу.

Два ехо-рядки передаються через systemd-cat, програму, яка приймає виведення з програми та надсилає його до журналу. Записи до журналу мають пріоритет. Ми використовуємо параметр -p (пріоритет), щоб вказати, що наші повідомлення призначені лише для інформації (інформації). Це не важливі помилки чи попередження.
Існує нескінченний цикл while.
Змінна TIMESTAMP встановлюється на поточну дату та час. Це форматується у повідомлення та надсилається до журналу.
Потім сценарій переходить у режим сну на 60 секунд.
Через 60 секунд цикл повторюється. Таким чином, цей скрипт записує повідомлення з міткою часу в журнал раз на хвилину.

Ми скопіюємо скрипт в каталог /usr/local/bin.

sudo cp htg.sh /usr/local/bin

І нам потрібно зробити його виконуваним:

sudo chmod +x /usr/local/bin/htg.sh

Створення файлу Service Unit

Кожна програма, яку запускає systemd, має файл визначення, який називається файлом службового блоку. Це містить певні атрибути, які systemd може використовувати для пошуку та запуску програми, а також для визначення певної її поведінки.

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

sudo systemctl list-unit-files --type-service

Ви можете прокручувати список файлів одиниць, відсортований в алфавітному порядку, і перевірити, чи не використовується ім’я, яке ви хочете використовувати.

Наша служба буде називатися «htg.service». Жоден файл модуля не має такої назви, тому ми можемо продовжити і створити наш файл модуля.

sudo gedit /etc/systemd/system/htg.service

Відкриється редактор gedit. Скопіюйте та вставте наступний текст у редактор:

[Unit]
Description=How-To Geek Service Example

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

Збережіть зміни та закрийте редактор.

  Як використовувати FFMpeg з графічним інтерфейсом у Linux за допомогою QWinFF

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

Опис: це текстовий опис вашого сервісу.
Хоче: наша служба хоче, але не вимагає, щоб мережа була відкрита до запуску нашої служби.
Після: список імен підрозділів, які слід запустити після успішного запуску цієї служби, якщо вони ще не запущені.
Тип: Простий. systemd вважатиме цю службу запущеною, як тільки процес, визначений ExecStart, буде роздвоєно.
ExecStart: шлях до процесу, який потрібно запустити.
Перезапуск: коли і чи потрібно перезапустити службу. Ми встановили для нього значення «при збій».
RestartSec: скільки часу потрібно чекати, перш ніж спробувати перезапустити службу. Це значення в секундах.
KillMode: визначає, як systemd має вбити процес, якщо ми просимо systemctl зупинити службу. У нас є цей набір для «обробки». Це змушує systemd використовувати сигнал SIGTERM лише для основного процесу. Якби наш сервіс був нетривіальною програмою, а не простим сценарієм, ми б встановили для цього значення «змішане», щоб гарантувати, що будь-які породжувані процеси також припиняються.
WantedBy: ми маємо для цього значення «multi-user.target», що означає, що службу слід запускати, поки система знаходиться в стані, коли кілька користувачів можуть увійти, незалежно від того, чи доступний графічний інтерфейс користувача.

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

Ця команда надасть власнику права на читання та запис, а також дозволи на читання групі. Інші не матимуть дозволів.

sudo chmod 640 /etc/systemd/system/htg.service

Ми можемо змусити systemctl перевірити синтаксис нашого файлу модуля, навіть якщо служба ще не запущена. Про будь-які помилки буде повідомлено. (Насправді, частина «.service» необов’язкова для більшості команд.)

systemctl status htg.service

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

  Як налаштувати шістнадцятковий редактор на Kali Linux

Запуск служби

Коли ви додаєте новий файл модуля або редагуєте існуючий, ви повинні вказати 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» і команду сну, яку запустив «htg.sh». Більшу частину часу команда сну виконуватиме роботу для цієї служби.

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

Зупинка та вимкнення служби

Якщо вам потрібно зупинити службу, ви можете зробити це за допомогою цієї команди:

sudo systemctl stop htg.service

Це зупиняє службу, але не заважає їй перезавантажуватися наступного разу, коли комп’ютер буде перезавантажено. Щоб зупинити запуск служби під час запуску, потрібно вимкнути її:

sudo systemctl disable htg.service

Якщо служба запущена, ця команда не зупиняє її. Він просто повідомляє systemd не запускати службу при наступному перезавантаженні.

Якщо ви хочете зупинити службу та запобігти її запуску під час запуску, використовуйте обидві команди.

Сервісна порада

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