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

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

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

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

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

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

systemctl list-units

список-одиниць systemctl

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

systemctl list-unit-files

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

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

# systemctl list-units -t service

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

# 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
getty@tty1.service 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».

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

  • —Держава – використовується для визначення стану демона Load, Active, Sub
  • —Тип – дозволяє фільтрувати юніти по їх типу.

приклади:

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

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

systemctl list-units -type = service вивести список сервісів в centos

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

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

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

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

# 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

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

# 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):

systemctl mask маскування сервісу

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

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

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

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

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

chmod +x /etc/rc.local

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

systemctl enable rc-local

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

service nginx start

rc.local - автозапуск команда в libux centos

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

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

sh /root/test.sh

rc.local запуск sh скрипта

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

Створення власного демона і додавання його в 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 – запускати скрипт кожну хвилину.

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

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

# 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

.bash_profile - запуск скрипта при старті сесії

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

приклад автозапуску скрипта через сесію

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

показувати uptime при вході

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

cd /var/
mc

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

Leave a Reply

Your email address will not be published. Required fields are marked *