У даній статті ми розглянемо основи управлінням автозавантаженням сервісів і скриптів в 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, це інформація буде до речі.