Управління автозавантаженням сервісів і скриптів в Linux

У даній статті ми розглянемо основи управлінням автозавантаженням сервісів і скриптів в Linux CentOS 7/8. Зокрема, розберемо основи роботи з демоном systemd, навчимося додавати в автозавантаження сервіси і прибирати їх звідти, а також розглянемо альтернативні варіанти запуску скриптів або демонів після старту системи.

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

зміст:

  • Systemd: управління автозавантаженням служб в Linux
  • Автозапуску скриптів і сервісів за допомогою rc.local
  • Створення власного демона і додавання його в systemd
  • Автозапуск через cron
  • .bashrc: автозапуск скриптів при запуску терміналу

Systemd: управління автозавантаженням служб в Linux

У большистве популярних сучасних популярних дистрибутивів Linux (CentOS 7, RHEL, Debian, Fedora і Ubuntu) в якості демона автозавантаження замість init.d використовується systemd. Systemd - менеджер системи і служб Linux, використовується для запуску інших демонів і управління ними в процесі роботи, використовує unit-файли з / etc / systemd / system (init.d використовував скрипти з каталогу /etc/init.d/). Systemd дозволяє распараллелить запуск служб в процесі завантаження ОС, тим самим прискорюючи запуск.

Для управління system використовується команда systemctl.

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

systemctl list-units

Список unit-файлів можна отримати командою:

systemctl list-unit-files

Дана команда відобразить всі доступні юніт-файли (не залежно від того, були вони завантажені в systemd після завантаження ОС чи ні).

Щоб вивести список активних сервісів і їх стан, виконайте:

# Systemctl list-units -t service

Наступна команда виведе список юнітів, які завантажив або намагався завантажити systemd. Так як після запуску деякі юніти можуть стати неактивними, за допомогою прапора -all ви отримаєте повний список.

# Systemctl list-units --all

UNIT LOAD ACTIVE SUB DESCRIPTION proc-sys-fs-binfmt_misc.automount loaded active waiting ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ● exim.service not-found inactive dead exim. service firewalld.service loaded active running firewalld - dynamic firewall daemon [email protected] loaded active running Getty on tty1 ● ip6tables.service not-found inactive dead ip6tables.service ● ipset.service not-found inactive dead ipset.service ● iptables. service not-found inactive dead iptables.service Bring up / down networking ● NetworkManager-wait-online.service not-found inactive dead 

Як бачимо зі списку, тут відображаються навіть сервіси, які не були знайдені на диску "not-found".

Використовую дану команду, ви можете додати і інші прапори, наприклад:

  • -state - використовується для визначення стану демона Load, Active, Sub
  • -type - дозволяє фільтрувати юніти по їх типу.

приклади:

systemctl list-units --all --state = active - виведе список тільки активних юнітів

systemctl list-units -type = service - виведе список юнітів, які є сервісом.

Додавання сервісу в systemd

Для управління сервісами в systemd використовується особливий синтаксис. Після імені серверсв в кінці потрібно вказувати .service. наприклад:

systemctl enable nginx.service - команда додасть в автозавантаження веб-сервер nginx

Дана команда створить символічне посилання на копію файлу, вказаного в команді сервісу, в директорії автозапуску systemd.

# Systemctl enable nginx.service

Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service
Висновок цієї команди показує в якій директорії був створений симлінк на файл сервісу.

Щоб подивитися доданий той чи інший сервіс в автозавантаження, можна перевірити його статус:

systemctl status nginx.service

При виведенні потрібно звернути увагу на рядок:

Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)

Значення enabled означає що даний сервіс завантажується автоматично (розміщений в автозавантаження). Якщо сервіс не завантажується автоматично, тут буде вказано disabled.

Видалення сервісу з systemd

Ви можете видалити сервіс з автозавантаження, щоб він не запускався після старту Linux (при цьому сам сервіс з сервера не видаляється). Щоб видалити сервіс з автозавантаження, виконайте команду:

systemctl disable нужний_сервіс

Наприклад, щоб видалити з автозавантаження nginx, виконайте:

# Systemctl disable nginx.service

Removed symlink /etc/systemd/system/multi-user.target.wants/nginx.service

Після виконання команди, симлінк на файл сервісу буде видалений з директорії systemd. Можна перевірити, чи є юніт в автозавантаженні:

# Systemctl is-enabled sshd

Systemd: маскування юнітів

У моїй практиці зустрічалися "шкідливі" сервіси, які після видалення їх з автозавантаження, все одно там залишалися і запускалися після рестарту ОС. Щоб вирішити це питання, можна замаскувати сервіс:

systemctl mask nginx.service

І після цього, він взагалі не буде запускатися, ні вручну, ні після перезавантаження ОС:

# Systemctl mask nginx.service

Created symlink from /etc/systemd/system/nginx.service to / dev / null.

# Service nginx restart

Redirecting to / bin / systemctl restart nginx.service Failed to restart nginx.service: Unit is masked.

Зняти маску можна командою:

# Systemctl unmask nginx.service

Removed symlink /etc/systemd/system/nginx.service.

Якщо після маскування сервісу, ви перевірите юніт-файли, то побачите, що сервіс позначений як замаскований (стан masked):

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

Автозапуску скриптів і сервісів за допомогою rc.local

Для запуску різних скриптів при завантаженні Linux найчастіше використовується rc.local.

Але крім скриптів, через rc.local так само можна і запускати сервіси, навіть ті, які запускаються через systemd. Не можу відповісти на питання, для чого використовувати в такому випадку rc.local, якщо є systemd, але пару прикладів я наведу.

Почнемо з того, що файл /etc/rc.local повинен бути виконуваним:

chmod + x /etc/rc.local

Rc.local повинен бути доданий в автозавантаження systemd:

systemctl enable rc-local

І на прикладі того ж nginx, ми можемо додати в rc.local команду запуску веб-сервера:

service nginx start

Але я рідко використовую rc.local для запуску сервісів. найчастіше rc.local використовується, коли потрібно запустити скрипт, або виконати разово якусь команду.

Наприклад, я створив скрипт /root/test.sh який виконує деякі дії, і хочу запустити його відразу після запуску системи. Додаємо в файл rc.local рядок:

sh /root/test.sh

Починаючи з CentOS 7, розробники вказують на те, що rc.local застарілий демон і здійснювати автозапуск скриптів або сервісів через нього, це минуле століття. Але поки він працює, я користуюся ним, так як він дуже простий в експлуатації.

Створення власного демона і додавання його в systemd

Ви можете створити власний демон, яким можна буде управляти через systemd.

Наприклад, нам потрібно запускати все той же скрипт /root/test.sh після перезавантаження системи. Почнемо зі створення файлу нашої майбутньої служби:

touch /etc/systemd/system/test-script.service
chmod 664 /etc/systemd/system/test-script.service
nano /etc/systemd/system/test-script.service

Вміст файлу буде наступне:

[Unit] Description = Template Settings Service After = network.target [Service] Type = oneshot User = root ExecStart = / root / test.sh [Install] WantedBy = multi-user.target 

Основні параметри:

User - користувач під яким буде запускатися демон

Type = oneshot - процес буде завершений до запуску подальших юнітів

Перевіряємо та перезапускаємо:
# Systemctl daemon-reload
# Systemctl start test-script.service
# Systemctl status test-script.service

● test-script.service - Test Loaded: loaded (/etc/systemd/system/test-script.service; disabled; vendor preset: disabled) Active: active (running) 

Якщо вас влаштувало те, як працює сервіс, додайте його в автозавантаження:

# Systemctl enable test-script.service

Created symlink from /etc/systemd/system/multi-user.target.wants/test-script.service to /etc/systemd/system/test-script.service.

Таким чином, ви можете додати будь-який ваш скрипт в автозавантаження через systemd.

Автозапуск через cron

Якщо вам з якоюсь періодичністю потрібно запускати скрипт або команду, ви можете скористатися cron-ом:

crontab -e - відкрити термінал для написання завдання cron

І додайте туди потрібне вам завдання, наприклад:

* * * * * /Root/test.sh - запускати скрипт кожну хвилину.

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

Щоб вивести список всіх завдань в крон, потрібно виконати команду:

# Crontab -l

* * * * * /Root/test.sh

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

  • Хвилини від 0 до 59
  • Годинники від 0 до 59
  • День місяця від 1 до 31
  • Місяць від 1 до 12
  • День тижня від 0 до 7 (0 або 7 цієї неділі)

У нашому завданні скрипт запускається кожну хвилину, тому там стоять "*".

Так само ви можете розмістити потрібний вам скрипт в директоріях cron:

  • /cron.daily - виконання скрипта щодня
  • /cron.hourly - виконання скрипта щогодини
  • /cron.monthly - виконання скрипта щомісяця
  • /cron.weekly - виконання скрипта щотижня

Скрипти в зазначених директорія будуть запускатися згідно автоматично підготовленого розкладу.

.bashrc: автозапуск скриптів при запуску терміналу

Якщо вам потрібно виконувати якісь дії під час запуску терміналу ssh, ви можете додати будь-яку команду або виконання скрипта в .bash_profile або .bashrc. Теоретично, ви можете додати будь-яку дію в будь-який з цих файлів, воно виконається в будь-якому випадку. Зазвичай все необхідне додається в .bashrc, а сам .bashrc запускають з .bash_profile.

Я додав у файл .bashrc команду на рестарт веб-сервісу nginx:

service nginx restart

Після цього зберіг файл і перезапустив термінал:

Як бачите, при запуску терміналу, веб-сервер був перезапущений. Які дії можна виконувати при запуску терміналу? Ймовірно, запускати якісь допоміжні утиліти, наприклад, перевірка uptime сервера:

Або ви хочете, щоб при запуску терміналу, ви відразу потрапляли в потрібну вам директорію і запускали mc, додайте в .bashrc

cd / var /
mc

Сподіваюся ця стаття з управління автозапуском сервісів і скриптів в LInux (стаття писалася для CentOS) виявилася корисною для вас. Напевно тим, хто тільки пізнає ази системного адміністрування Linux, це інформація буде до речі.