Linux запуск скрипта при старте системы

Linux запуск скрипта при старте системы

Иногда пользователи могут столкнуться с необходимостью добавления каких-то сервисов или событий в автозагрузку Linux системы (Ubuntu, Debian, CentOS, Gentoo, Alpine Linux и так далее), но не всегда удается сделать это встроенным в графическую среду средствами (например Startup Applications в Ubuntu). То, как сделать простой скрипт и добавить его запуск при инициализации системы будет рассказано ниже.

Опишем это на простом примере: opendchub – это сервис dc-хаба, который может запускаться только под супер-пользователем (то есть он запускается вручную только командой sudo opendchub или непосредственно под root’ом).

Для начала создадим скрипт запуска в стандартном каталоге инициализации системы:

sudo nano /etc/init.d/odchub

В текстовом редакторе введите три строки будущего скрипта:

#!/bin/bash
echo «Opendchub starting. »
opendchub

Сохраните изменения (Ctrl+O) и выйдите из текстового редактора nano (Ctrl+X)
В первой строке этого скрипта указывается интерпретатор (если вы не знакомы с этим понятием, то лучше оставить именно такой как указан выше).
Во второй строке, командой echo обеспечивается простой вывод на экран текста – в принципе эта строка необязательна, она лишь будет информировать пользователя о том, какое действие происходит в данный момент.
Третьей строкой собственно указывается команда запуска (в нашем примере – это сервис opendchub) – пишется тут всё точно также, как вы выполняли необходимую команду в терминале, за исключением того, что не надо добавлять ‘sudo‘ – так как этот скрипт будет выполняться при инициализации системы, то есть уже сразу под суперпользователем.

После того как файл создан, сделаем его исполняемым:

sudo chmod +x /etc/init.d/odchub

Теперь добавим созданный скрипт к автозагрузке. Для этого есть несколько способов, опишем два наиболее встречающихся.

Если вывод команды:

в вашем дистрибутиве покажет “systemd”, то рекомендуем создать systemd unit, в других случаях стоит прибегнуть ко второму описаному решению, init.
Systemd и init – это разные системы инициализации, используемые в Linux. Изначально массово использовалась init, но последние годы во всё большем количестве дистрибутивов используется systemd. Стоить добавить, что это не единственные системы инициализации, но как правило большинство из них поддерживают синтаксис init.

Перед тем как добавить наш сценарий в автозагрузку при использовании системы инициализации systemd, потребуется создать соответствующий файл описания (так называемый “юнит”, являющийся прямой инструкцией системной службы):

sudo nano /etc/systemd/system/odchub.service

В текстовом редакторе скопируйте следующие строки в этот файл:

[Unit]
Description=Opendchub service
After=network.target
[Service]
ExecStart=/etc/init.d/odchub
[Install]
WantedBy=multi-user.target

Сохраните изменения (Ctrl+O) и выйдите из текстового редактора nano (Ctrl+X).
Description – заполняентся произвольно, это просто описание юнита.
After=network.target – означает, что эта служба сможет быть запущена только после поднятия сетвых сервисов.
ExecStart – путь к исполняемому файлу, будет выполнять при старте службы.
WantedBy=multi-user.target – означает, что будущий сервис будет запускаться после активации цели multi-user.target (примерно тоже самое что runlevel 3 в init).
Более подробно о возможностях systemd можно прочесть здесь или здесь.

После сохранения файла юнита вы можете использовать созданную службу odchub, например, стартовать (единократно выполнить написанный нами скрипт):

sudo systemctl start odchub

А этой командой вы “включите”, то есть добавите в автозагрузку системы:

sudo systemctl enable odchub

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

sudo systemctl disable odchub
sudo rm /etc/systemd/system/odchub.service

После того как создан исполняемый скрипт в соответствующей директории (в нашем случае /etc/init.d/odchub), для включения его при загрузках системы, достаточно выполнить команду:

sudo update-rc.d odchub defaults 90

Числовое значение после слова defaults указывает на приоритет для старта этого скрипта.

В результате этих действий сервис opendchub будет запускаться еще до загрузки графической среды, сразу вместе с инициализацией операционной системой. Если вы захотите удалить этот скрипт из автозагрузки, то перед тем как удалить сам файл надо выполнить такую команду:

sudo update-rc.d -f odchub remove

Используя эти простые примеры вы можете аналогичным образом создать свой собственный скрипт и добавить его к автозагрузке.

Читайте также:  Brother dcp 1510r linux

12 Comments Leave a comment

Огромное спасибо.
очень пригодилось для автоматического монтирования расшаренного диска в виртуальной манине

Огромное спасибо! долго пытался добавить отключение APM винчестера в автозагрузку, очень помогло! что скрипт надо кинуть в init.d и сделать исполняемым я знал, а вот просто update-rc – нет

Подскажите, а этот скрипт будет стартовать для конкретного пользователя или для всех.
У меня просто стоит NX сервер и мне нужно каждый раз вручную логиница и запускать скрипт для расшара папки.
P.S. Заранее спасибо!

Igor, этот скрипт будет запускаться под пользователем root при инициализации системы. Также, можно написать специальный скрипт, который сможет запускать различные программы под какими-то определенными пользователями.

А NX server исправно автозапускается после установки из deb с официального сайта. Вы собирали его из исходного кода?

да. Nx собирался именно так.
Может мне сделать так??
# права на исполнение
sudo chmod +x /etc/init.d/my_script
# симлинк на запуск в автомат.
sudo ln -s /etc/init.d/my_script /etc/rc1.d/S20_my_script # запуск при single user mode
————————————-
Я делал когда то такое для Iptables, что бы он автоматически запускал мои правила.
Но в моём случае, каждое утро я захожу и запускаю этот скрипт вручную что бы дать права на использование пользователям.

Igor, да, установите из deb пакетов, так будет проще.

#!/bin/bash
sudo chmod -R 777 /var/lib/wine/my_dir
———————————————————–
вот такая нехитрая комманда. а приходица каждый день запускать.

Спасибо за полезную информацию! Не могли бы подробнее рассказать, как написать скрипт для запуска программы от имени другого пользователя, не root? Есть сервер с ирком, ирк стартует автоматически от имени суперпользователя, а вот чат-бота eggdrop стартовать из-под рута нельзя..

Anton, попробуйте через sudo:

sudo -u username program

Если не получится, то установите sux:

sudo apt-get install sux

И запускайте программу через команду:

sux — username program

Спасибо, информацию про sux взял на заметку, а в моем случае помогло следующее: в rc.local написал по типу su username -c /home/username/eggdrop.sh

Данная команда изменит только лишь текущую цель и не повлияет на следующую загрузку системы. Она соответствует командам Sysvinit вида

Источник

Выполнение скрипта при запуске или выключении linux

Если на вопрос: «как добавить программу в автозагрузку?» — начинающие пользователи находят ответ достаточно быстро, то вопрос о запуске скрипта, при выключении/перезагрузки, ставит их в тупик. В статье будет описан стандартный способ для автоматического выполнения команд при включении и выключении linux, а также более простой способ для пользователей, у которых установлен gdm и графический интерфейс, например ubuntu.

Консольный вариант.

Немного теории.
Следует знать, что в Linux существует 7 уровней запуска. Однако, использоваться могут только 6.
Как у всех уважающих себя программ отсчёт начинается с 0-ля.
0 — Остановка или выключение системы.
1 — Однопользовательский режим.
2 — Многопользовательский режим, но без поддержки сети.
3 — Тоже самое, но с сетью.
4 — Добавили для красоты Не используется.
5 — Графический режим с загрузкой X сервера.
6 — Перезагрузка.
Если перейти в папку /etc (В некоторых дистрибутивах /etc/rc.d) то можно увидеть папки с 7-мью уровнями запуска.

Например при выключении компьютера, выполнятся все скрипты из папки rc0.d

Тут следует остановится по подробнее. Дело в том, что самих скриптов (а точнее сценариев) в этой папке нету, а есть только ссылки на файлы, которые лежат в папке /etc/init.d. Эти сценарии выполняют различные задачи, в зависимости от параметра start или stop (например /etc/init.d/reboot start и /etc/init.d/reboot stop это разные команды, а /etc/init.d/reboot вообще не будет работать). Если в ссылке стоит первая буква S, то значит сценарию подаётся параметр start, а если стоит буква K(от слова kill), то параметр stop. Цифра после буквы обозначает порядок выполнения сценария.
Например, на выше вставленном скриншоте вначале выполниться команда /etc/init.d/hddtemp stop, а уже позже /etc/init.d/networking start.
Хватит теории. Переходим к практике.
Для того, чтобы добавить команду в автозагрузку, достаточно поместить её в файл /etc/rc.local.

В этой части статьи в качестве редактора будет использоваться nano, но вы можете пользоваться своим любимым редактором, например gedit.

И помещаем наши команды чуть выше строчки с exit 0.
Для того, что бы команды выполнялись перед выключением или перезагрузкой нам нужно создать сценарий в папке /etc/init.d

Вставляем следующий код:

Если будет подаваться только один сигнал, то просто закомментируйте строку поставив в начале команды знак #
Например

Читайте также:  Программное обеспечение для линукса

Теперь делаем файл исполняемым:

Создать ссылки можно вручную, но проще это сделать через команду update-rc.d
Например:

Точки важны (обе). Исследуя просторы интернета, у меня сложилось впечатление, что синтаксис этой программы иногда меняется. Актуальные примеры можно посмотреть по команде «man update-rc.d». Примеры будут в низу.

Эта команда создаст по 2 ссылки в каталогах /etc/rc0.d (второе число в команде) и /etc/rc6.d (третье число в команде). Причём вначале будет выполняться сценарий с параметром stop (т.к. стоит 1), а уже потом с параметром start (т.к. стоит 20).
Если второй параметр не нужен, то можно выполнить команду:

Советую ставить приоритет повыше (т.е. число после start или stop должно быть маленьким), желательно меньше 20. В обратном случае у меня иногда зависал компьютер при попытке перезагрузиться.

Для пользователей ubuntu, да и многих других современных дистрибутивов с gdm можно воспользоваться…

Графический вариант.

Что касается автозагрузки то можно воспользоваться способом описанным здесь.
Или просто открыть «автоматически запускаемые приложения» командой:

Для выполнения скрипта при выключении компьютера, помещаем его в файл /etc/gdm/PostSession/Default

Источник

Управление автозагрузкой сервисов и скриптов в Linux

В данной статье мы рассмотрим основы управлением автозагрузкой сервисов и скриптов в 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: маскировка юнитов

В моей практике встречались «вредные» сервисы, которые после удаления их из автозагрузки, все равно там оставались и запускались после рестарта ОС. Чтобы решить этот вопрос, можно замаскировать сервис:

Читайте также:  Windows server кодовая страница

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, это информация будет кстати.

Источник

Оцените статью