Управление автозагрузкой сервисов и скриптов в Linux
21.04.2020
VyacheslavK
CentOS, Linux
комментариев 8
В данной статье мы рассмотрим основы управлением автозагрузкой сервисов и скриптов в Linux CentOS 7/8. В частности, разберем основы работы с демоном systemd, научимся добавлять в автозагрузку сервисы и убирать их оттуда, а также рассмотрим альтернативные варианты запуска скриптов или демонов после старта системы.
Задача статьи – научить вас быстро разобраться со списками служб и скриптов которые запускаются в Linux автоматически, добавить в автозагрузку свои службы или скрипты, или отключить автозапуск определённых программ.
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:
Список unit-файлов можно получить командой:
Данная команда отобразит все доступные юнит-файлы (не зависимо от того, были они загружены в systemd после загрузки ОС или нет).
Чтобы вывести список активных сервисов и их состояние, выполните:
# systemctl list-units -t service
Следующая команда выведет список юнитов, которые загрузил или пытался загрузить systemd. Так как после запуска некоторые юниты могут стать неактивными, с помощью флага —all вы получите полный список.
# systemctl list-units —all
Как видим из списка, здесь отображаются даже сервисы, которые не были найдены на диске «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
Чтобы посмотреть добавлен тот или иной сервис в автозагрузку, можно проверить его статус:
systemctl status nginx.service
При выводе нужно обратить внимание на строку:
Значение enabled означает что данный сервис загружается автоматически (добавлен в автозагрузку). Если сервис не загружается автоматом, здесь буде указано disabled.
Удаление сервиса из systemd
Вы можете удалить сервис из автозагрузки, чтобы он не запускался после старта Linux (при этом сам сервис с сервера не удаляется). Чтобы удалить сервис из автозагрузки, выполните команду:
systemctl disable нужный_сервис
Например, чтобы удалить из автозагрузки nginx, выполните:
# systemctl disable nginx.service
После выполнения команды, симлинк на файл сервиса будет удален из директории systemd. Можно проверить, есть ли юнит в автозагрузке:
# systemctl is-enabled sshd
Systemd: маскировка юнитов
В моей практике встречались «вредные» сервисы, которые после удаления их из автозагрузки, все равно там оставались и запускались после рестарта ОС. Чтобы решить этот вопрос, можно замаскировать сервис:
systemctl mask nginx.service
И после этого, он вообще не будет запускаться, ни вручную, ни после перезагрузки ОС:
# systemctl mask nginx.service
# service nginx restart
Снять маску можно командой:
# systemctl unmask 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 строку:
Начиная с 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
Содержимое файла будет следующее:
User – пользователь под которым будет запускаться демон
Type=oneshot — процесс будет завершен до запуска дальнейших юнитов
Проверяем и перезапускаем:
# systemctl daemon-reload
# systemctl start test-script.service
# systemctl status test-script.service
Если вас устроило то, как работает сервис, добавьте его в автозагрузку:
# systemctl enable test-script.service
Таким образом, вы можете добавить любой ваш скрипт в автозагрузку через systemd.
Автозапуск через cron
Если вам с какой-то периодичностью нужно запускать скрипт или команду, вы можете воспользоваться cron-ом:
crontab -e — открыть терминал для написания задания cron
И добавьте туда нужное вам задание, например:
* * * * * /root/test.sh — запускать скрипт каждую минуту.
Можно написать скрипт watch-dog, который по заданию будет проверять, например, статус какого-либо сервиса и, если он не работает, запускать его. На нескольких своих проектах я использую подобную схему.
Чтобы вывести список всех заданий в крон, нужно выполнить команду:
Допустимые значения для времени запуска заданий 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
Надеюсь эта статья по управлению автозапуском сервисов и скриптов в LInux (статья писалась для CentOS) оказалась полезной для вас. Наверняка тем, кто только познает азы системного администрирования Linux, это информация будет кстати.
Предыдущая статья Следующая статья
Добавление команд в автозагрузку Linux
На данный момент описанный мною способ уже устарел и лучше использовать другие способы. Например: для добавления служб можно воспользоваться командой systemctl. А для запуска своих скриптов использовать Systemd. Пока обновляется информация по этой статье, попробуйте поискать материал по этому вопросу в других источниках.
Чтобы команды запускались автоматически при старте Линукс, нужно создать файл /etc/init.d/local
Затем добавляем свои команды или скрипты, например:
Теперь файл, состоящий из списка команд, добавим в автозагрузку:
Этого достаточно, чтобы запускать команды и сервисы автоматически при загрузки системы.
Спасибо за ваш отзыв!
После нажатия кнопки «Отправить» ваше сообщение будет доставлено мне на почту.
Права на использование материала, расположенного на этой странице https://vivazzi.pro/ru/it/add-comands-to-autorun-linux/:
Разрешается копировать материал с указанием её автора и ссылки на оригинал без использования параметра rel=»nofollow» в теге <a> . Использование:
Предыдущая статья Примеры расширения админки Django
Следующая статья rndc: connect failed: 127.0.0.1#953: connection refused
Похожие статьи:
/> Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.
Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.
Я хочу добавить в автозапуск команду: windscribe start. Ваш метод не помог.
Описанный мною способ работает на Linux Debian (сам пользуюсь). Может для других версий Линукс по-другому надо делать?
Прочитал, что оказывается описанный мною способ уже устарел и лучше использовать другие способы. Например: если хочешь добавить сервис, например, тот же windscribe, то можно воспользоваться командой :
` sudo systemctl enable windscribe `
Или если свой скрипт запускать, то лучше использовать Systemd .
Поэтому попробуйте поискать материал, как добавить службы через systemctl или свои скрипты в автозагрузку с помощью Systemd.
Автозагрузка Linux
При запуске ПК на базе Linux приходится многие программы включить вручную. Пользователи с ними работают каждый день и глупо тратить время на подобные операции. К счастью, существует опция автозагрузки, которая хорошая работает в Linux.
Принцип работы
В рамках темы подключения автозагрузки интересуют понятия, типы подключения. Есть возможность проводить операции на уровне ядра либо системы инициализации. Многие используются скрипты, распространенные сервера. В окружении рабочего стола также найдется инструмент метки.
При запуске операционной системы Linux важно определиться с программами, которые применяются каждый день. Все они должны быть отмечены системой инициализации. Удобная функция доступна на ПК с обновлениями либо без них.
Процесс является быстрым, однако существует несколько подходов.
Основной командой принято считать System. Она не запускается по умолчанию, требуется ручное подключение. Процессы происходят поэтапно, запускают ряд скриптов. Многих может испугать многоуровневость процесса, однако достаточно лишь один раз выбрать функцию.
Про основные методы
Если рассматривать уровень ядра, он говорит о программе, которая отслеживает весь функционал ПК. Конкретно при запуске процессора, а именно ядра, происходит получение команд. Речь идет о вышеупомянутой системе инициализации.
Далее о списке представлена автозагрузка через протокол. Особенности:
- подключение серверов;
- один скрипт;
- быстрая инициализация системы.
Как понятно из вышеупомянутого списка, один протокол запускает скрипт. Сервер выступает хранилищем для сохранности всех выбранных программ. К примеру, это может быть текстовый редактор либо Скайп. Главное — задать путь.
Следующим способом обозначена команда local. Метод считается устаревшим, однако его также стоит рассмотреть. Скрипты в local затрагивает графическое окружение. Ранее оценивалась активность процессора, а именно его ядра. В данном случае на первом месте стоит графический модуль.
Менеджер входа остается одним из основных способов использования автозагрузки. Он отличается простой и набором понятных команд, которые не конфликт между собой. При запуске окружения происходит перелинковка. Система инициализации проверяет допуски всех программ и оставляет только те, которые нужны на данный момент.
Прочие методы для автоматической активации приложений
На ПК с операционной Linux замечательно работают сервера. Речь идет о комплексе программ, которые определяют базовые скрипты. Через отдельные сервера происходит старт приложений. Это могут быть системный либо частный софт.
На втором месте стоит окружение с поддержкой. Через настройки отложенного запуска также получается управлять программами на ПК. Главное — выбрать параметры доступа, чтобы программы не конфликтовали между собой.
Последний по списку значится метод bash. Принцип работы основан на создании отдельной папки, которая отслеживает активность приложений. Команды на них поступают автоматически, важно просто дождаться открытия. Отдельно упоминается терминал базы данных.
Важно! Через терминал базы данных удается добавлять новые программы для автозагрузки и удалять нежелательный софт из списка.
Про автозагрузку ядра
На уровне ядра есть возможностью выставлять программы для автозагрузки. Речь идет только на системе Линукс. Для этого предусмотрена команда Init, которая доступна через настройки. Программа запускается через вкладку инициализации.
При переходе в настройке проверяется поле оболочки. Возможны варианты с Bash, System. В любом случае действуют стандартные конфигурации, которые видят все программы без разбору. При переходе в строку команды набирается bcfg, что свидетельствует о старте автозагрузки.
Далее прописывается основной код с указанием всех программ для автозапуска. Это могут быть чаты или Телеграмм. Некоторых заинтересует ВК либо ФБ. Для работы понадобится текстовый редактор и таблицы. Это могут быть презентации и прочее.
- не отображаются программы;
- не получается включить оболочку.
В первом случае ПК просто перезагружается. Проблема с оболочкой требуется переустановки Линакс. Как правило, используется последнее обновлении и можно забыть о недостающих настройках.
Система инициализации – особенности работы
Система инициализации в Линуксе устроена довольно просто. При переходе в сервис первым делом отображаются текущие службы. Это могут быть графические программы или последние обновления. Пользователи смотрят на доступные операции и по умолчанию доступно отсрочка, немедленный запуск.
Также легко перейти на параллельное подключение и зависимость. При переходе в настройки открываются доступные команды. Некоторые из них позволяют регулировать системные службы. Это требуется, когда важно заменить установленный софт. Что касается автозагрузки, применяются строки Apache.
Пользователи выбирают программы, которые в данный момент установлены на ПК.
Далее проставляются галочки для использования их по умолчанию.
- отсутствуют настройки;
- нет возможности найти системные программы.
Первый вариант может встречаться из-за ограниченности версии. Система Linux устроена таким образом, что многие функции скрывает по умолчанию. Разблокировка происходит при инициализации Sys. Есть возможность просматривать программы вручную.
Чтобы добавить службу в автозагрузку, необходимо ввести команду enable.
systemctl enable название службы
systemctl disable название службы
Скрипты в Линукс
Как только пользователь разберется в скриптах, ему сразу станет ясно, как эффективно и быстро выставлять программы для автозагрузки. Все это потребуется для работы, это файл LOCAL. Раньше в rc.local добавляли команды bash, которые должны были запуститься при старте операционной системы, однако в новых версиях Linux его упразднили.
С помощью systemd, создадим файл и добавим его в автозапуск, как любую службу.
Разрешаем выполнять скрипт.
chmod +x /etc/rc.local
Включаем файл local в автозапуск.
systemctl enable rc-local
systemctl start rc-local
systemctl status rc-local
- не срабатывает скрипт;
- сразу высвечивает ошибку.
Скрипт может не срабатывать по причине неверного кода. Если имя файла является корректным, система выдает внятные ошибки к скрипту. К примеру, может встретиться несовместимость или большое количество программ. В настройках могут быть ограничения по правам пользователя.
Также отдельно оценивается функция автозагрузка в зависимости от версии Линукс. Второй проблемой значится ошибка, и тут высматривается его код. Все ошибки, которые начинаются на 02, свидетельствуют о грамматической подмене.
При пересмотре приложений становится ясно, что некоторые названия были записаны не полностью. Отдельно проверяется путь, так как система должна распознавать софт, а не его дубликаты.
Работа с серверами
Сервера в Linux требуются для того, чтобы сохранять все скрипты на своем месте. Синтаксис команд является не сложным, поэтому рассматриваются строки HR, ET, которые дают общее представление о работе с программой.
Первым делом вводится пункт HR и далее открываются скобки. Важно обратиться к настройке приложения и для этого указывается полный пункт. Короткое обозначение функции – РР. Система Linux при этом должна понимать, с какой программой точно требуется проводить манипуляции.
Ее название стоит отделять скобками или переносить текст на другую строку. Многие стараются использовать сокращенные названия. Чтобы его узнать, важно отметить пункт программы и посмотреть активную строку.
Вывод
Выше описано, как использовать автозагрузку Линакс. Пользователи применяют скрипты, сторонние приложения. Отлично работают сервера, настройки самой системы, поэтому проблемы возникают крайне редко.
How to run scripts on start up?
How can I run scripts automatically when Ubuntu starts up so I don’t have to run them manually after startup?
10 Answers 10
One approach is to add an @reboot cron task:
-
Running crontab -e will allow you to edit your cron.
Adding a line like this to it:
will execute that script once your computer boots up.
Depending on what sort of scripts you need to run.. For services and the like you should use upstart. But for a user script these should be launched as session scripts by gnome! Have a look under System > Preferences > Startup Applications.
On a side note if you need some scripts to be run on terminal login you can add them to the .bash_login file in your home directory.
For 14.04 and older
A simple command (one which doesn’t need to remain running) could use an Upstart job like:
Save this in a .conf file in /etc/init (if you need it to run as root when the system boots up), or in
/.config/upstart (if you need it to run as your user when you log in).
/.config/upstart . So where are startup applications defined?
You can add commands to /etc/rc.local :
This executes the commands as root.
To execute commands as a specific user, use sudo -i -u ( -i to also run the login shell). For example, to establish a persistent SSH tunnel, where myhost is definde in johndoe s
Note that if /etc/rc.local did not exist (as is the case on Ubuntu since 16.04), you need to add a shebang line at the top (e.g. #!/bin/bash ), and ensure the file is executable:
For 15.04 and later:
To run a (short-lived) 1 command at startup using systemd , you can use a systemd unit of type OneShot . For example, create /etc/systemd/system/foo.service containing:
Essentially, this is just converting a typical Upstart job to a systemd one (see Systemd for Upstart users).
You can run multiple commands from the same service file, using multiple ExecStart lines:
The command must always be given with the full path. If any command fails, the rest aren’t run. A — before the path tells systemd to ignore a non-zero exit status (instead of considering it a failure).
For user sessions, you can create the systemd unit in
/.config/systemd/user instead. This should work with 16.04 onwards, but not earlier releases of Ubuntu with systemd (since those still used Upstart for user sessions). User session units can be controlled with the same commands as with system services, but with the —user option added:
Shell syntax
Note that, unlike Upstart, systemd doesn’t run the Exec* commands through a shell. It performs some limited variable expansion and multiple command (separated by ; ) itself, but that’s about it as far as shell-like syntax goes. For anything more complicated, say redirection or pipes, wrap your command in sh -c ‘. ‘ or bash -c ‘. ‘ .
1 As opposed to long-lived daemons.
There are different ways to automatically run commands:
The upstart system will execute all scripts from which it finds a configuration in directory /etc/init . These scripts will run during system startup (or in response to certain events, e.g., a shutdown request) and so are the place to run commands that do not interact with the user; all servers are started using this mechanism.
You can find a readable introduction to at: http://upstart.ubuntu.com/getting-started.html the man pages man 5 init and man 8 init give you the full details.
A shell script named .gnomerc in your home directory is automatically sourced each time you log in to a GNOME session. You can put arbitrary commands in there; environment variables that you set in this script will be seen by any program that you run in your session.
Note that the session does not start until the .gnomerc script is finished; therefore, if you want to autostart some long-running program, you need to append & to the program invocation, in order to detach it from the running shell.
The menu option System -> Preferences -> Startup Applications allows you to define what applications should be started when your graphical session starts (Ubuntu predefines quite some), and add or remove them to your taste. This has almost the same purpose and scope of the .gnomerc script, except you don’t need to know sh syntax (but neither can you use any sh programming construct).