Debian 10 rc local нет

Обновлено: 04.07.2024

Я не могу найти правильный способ выполнения некоторых локальных сценариев (или очень локальных команд) в systemd, я уже знаю, что не должен создавать службу (в systemd модуле) для таких сценариев (или я должен?) .

Обходной путь, который я нашел, состоит в том, чтобы создать rc.local и дать ему разрешения на выполнение.

Например, если я получу устаревший сервер с настроенным вами простым rc.local, я буду знать, что вы делали, и насколько это повредит обновлению или установке чего-то нового в дистрибутиве, поскольку rc.local уважался внешним пакеты, но с другой стороны, если я устанавливаю сервер и создаю системный модуль или два или три (или даже службы sysvinit), просто для выполнения простой задачи, это может иногда сделать вашу жизнь тяжелее, и намного больше, чем это мои модули Когда-нибудь имена могут конфликтовать с именами новых сервисов, созданных при разработке дистрибутива и, возможно, установленных при обновлении, что вызовет проблемы для моих скриптов!

Я вижу еще один вопрос с просьбой о где rc.local и ответ должен был создать и дать права исполнения, я думаю , что мой вопрос на самом деле не дубликат , потому что я не хочу знать , где это - поверьте, я просто хочу чтобы принять , что она устарела , но я не могу найти правильный путь для ведения такого рода вещи, я должен действительно создать устройство только для некоторых простых , как это?

systemd «единственный выигрышный ход - не играть»; альтернативно, в зависимости от того, что вы хотите, вы можете создать системный модуль. Я бы, наверное, сейчас использовал rc.local и позаботился бы об этом, когда он уйдет. То есть вы думаете, что официальный способ - создать подразделение, подобное сервису? Пожалуйста, напишите в качестве ответа, как это сделать. Когда я попробовал Ubuntu, я создал модуль для постоянного кэширования ssh-агента на моем рабочем столе, пока я не перезагружался, а другой для чего-то еще, что я не помню; Вы также можете создать один, указывающий на /etc/rc.local, но, похоже, система делает это для себя на данный момент . Я бы на данный момент rc.local, и если будет прекращено, создать один, указывающий на подделку /etc/rc.local тогда. Это может нарушить документацию, как если бы в какой-то книге говорилось, что вы должны поместить что-то в /etc/rc.local, и вы пытаетесь обновить этот документ, например, если rc.local должен быть помечен как исполняемый, когда он полностью устарел документация не работает, но если вы говорите, что должны создать модуль, указывающий на /etc/rc.local, это нарушит документацию, поскольку systemd конфликтует с вашим модулем. Я полагаю, если вы правы, они, вероятно, не решили, является ли это устаревшим или нет, потому что у них все еще нет замены . когда они решат, что вся документация будет снова сломана. Какой вид сценария вам нужно выполнить? Systemd имеет много типов юнитов. «Сервис» - это только один из многих типов единиц . Например, монтирование юнитов, автомонтирование юнитов, таймеров, целевых юнитов Может ли один из них решить вашу проблему?

Как указано в другом месте, он становится умеренно нечистым для использования rc-local.service под systemd .

  1. Теоретически возможно, что ваш дистрибутив не включит его. (Я думаю, что это не распространено, например, потому что отключение той же опции сборки также удаляет poweroff / reboot команды, которые используют многие люди).
  2. Семантика не совсем понятна. Systemd определяет rc-local.service один путь, но Debian предоставляет раскрывающийся файл, который изменяет по крайней мере один важный параметр.

rc-local.service часто может работать хорошо. Если вы беспокоитесь о вышесказанном, все, что вам нужно сделать, это сделать свою собственную копию! Вот волшебство:

Я не думаю, что вам нужно понимать каждую деталь [*], но здесь нужно знать две вещи.

Вы должны включить это с systemctl enable my-startup.service .

Если ваш скрипт имеет зависимость от любого другого сервиса, в том числе network-online.target , вы должны объявить его. Например, добавить [Unit] раздел с линиями Wants=network-online.target и After=network-online.target .

Вам не нужно беспокоиться о зависимости от сервисов «ранней загрузки», в частности, сервисов, которые уже были заказаны ранее basic.target . Такие сервисы my-startup.service автоматически заказываются после basic.target , если они не установлены DefaultDependencies=no .

Если вы не уверены, является ли одна из ваших зависимостей службой «ранней загрузки», один из подходов заключается в перечислении служб, которые были упорядочены ранее basic.target , путем их запуска systemctl list-dependencies --after basic.target . (Обратите внимание, это --after не так --before ).

Есть некоторые соображения, которые, я думаю, также применимы к pre-systemd rc.local :

  1. Вы должны убедиться, что ваши команды не конфликтуют с другой программой, которая пытается контролировать то же самое.
  2. Лучше всего не запускать долго работающие программы, также известные как демоны rc.local .

[*] Я использовал Type=oneshot +, RemainAfterExit=yes потому что это имеет больше смысла для большинства одноразовых сценариев. Он формализует, что вы запустите ряд команд, которые my-startup будут показаны как «активные» после их завершения, и что вы не запустите демон.

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

В этой статье мы рассмотрим как работает автозагрузка Linux, как добавить программы автозагрузки, куда их будет более правильно добавить, а также какие виды автозагрузки бывают в этой операционной системы.

Как работает автозагрузка?

Чтобы понять как работает автозагрузка, сначала нужно вспомнить, что происходит во время процесса загрузки Linux. Как только ядро завершит свою инициализацию и будет готово к дальнейшей работе, оно передаст управление системе инициализации. Система инициализации - это основной процесс, именно он запускает все другие процессы в системе.

Есть процессы, которые система инициализации, например, systemd, запускает по умолчанию, но также вы можете настроить чтобы она запускала нужные вам процессы. Также многими дочерними процессами выполняются файлы скриптов или имеется та или иная возможность запускать необходимые вам программы. Такая возможность есть и у большинства окружений рабочего стола.

Рассмотрим основные уровни автозагрузки которые вы можете использовать:

  • Автозагрузка на уровне ядра - вы можете указать любую программу, которая будет запускаться после старта ядра вместо системы инициализации;
  • Автозагрузка системы инициализации - запуск основных системных сервисов, дополнительных сервисов, а также ваших скриптов на этапе инициализации системы;
  • Автозагрузка rc.local - устаревший метод загрузки скриптов, выполняется перед запуском графического окружения;
  • Автозагрузка менеджера входа - вы можете выполнять свои скрипты или команды после запуска менеджера входа, но перед запуском окружения;
  • Автозагрузка X сервера - запуск нужных программ или скрпитов сразу после старта X сервера;
  • Автозагрузка окружения - большинство окружений поддерживают автозагрузку программ, там даже можно настроить отложенный запуск и другие параметры;
  • Автозагрузка bash - самый последний вариант - это автозагрузка на уровне отдельной командной оболочки, вы можете выполнять нужные команды автоматически, как только будет запущен терминал.

Дальше мы рассмотрим более подробно как использовать каждый из пунктов для автозагрузки программ, скриптов или выполнения команд в Linux.

Автозагрузка на уровне ядра

sudo vi /boot/grub2/grub.cfg

linux /vmlinuz-4.8.0-22-generic root=/dev/mapper/systems-ubuntu ro quiet init=/bin/bash

Но, обычно, удобнее изменить это значение временно, в меню Grub. Читайте подробнее об этом в статье параметры ядра Linux. Так не выполняется автозагрузка программы linux, но, тем не менее, иногда может быть полезно.

Автозагрузка в системе инициализации

Чаще всего, когда говорится автозагрузка Linux, подразумевается именно автозагрузка сервисов с помощью системы инициализации. В systemd очень продвинутая система управления службами. Здесь поддерживается разрешение зависимостей, параллельный запуск, отсрочка запуска и перезапуск при ошибке. В терминологии Systemd все запускаемые программы представлены файлами юнитов, в каждом юните описаны параметры программы, ее исполняемый файл, а также дополнительные требования к запуску.

Для добавления или удаления служб из автозапуска используется команда systemctl. Чтобы добавить службу в автозапуск выполните:

sudo systemctl enable имя_службы

А чтобы отключить ее автозапуск linux:

sudo systemctl disable имя_службы

Например, если вы хотите добавить в автозагрузку Apache, то нужно выполнить:

sudo systemctl enable apache

Также вы можете проверить добавлена ли уже служба в автозагрузку:

Если вы не знаете точное имя файла сервиса, но знаете его первую букву, то можно использовать автодополнение, как и в любом другом месте терминала с помощью кнопки Tab:

Также вы можете посмотреть все сервисы, которые были добавлены в автозагрузку с помощью команды:

systemctl list-unit-files | grep enabled

Автозагрузка скриптов в Linux

Раньше было принято размещать все скрипты, которые запускаются по умолчанию в файле /etc/rc.local. Этот файл все еще существует, но это пережиток системы инициализации SysVinit и теперь он сохраняется только для совместимости. Скрипты же нужно загружать только с помощью Systemd.

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

sudo vi /lib/systemd/system/runscript.service

[Unit]
Description=My Script Service
After=multi-user.target
[Service]
Type=idle
ExecStart=/usr/bin/local/script.sh
[Install]
WantedBy=multi-user.target

В секции Unit мы даем краткое описание нашему файлу и говорим с помощью опции After, что нужно запускать этот скрипт в многопользовательском режиме (multi-user). Секция Service самая важная, здесь мы указываем тип сервиса - idle, это значит, что нужно просто запустить и забыть, вести наблюдение нет необходимости, а затем в параметре ExecStart указываем полный путь к нашему скрипту.

Осталось выставить правильные права:

sudo chmod 644 /lib/systemd/system/runscript.service

Затем обновить конфигурацию и добавить в автозагрузку Linux новый скрипт:

sudo systemctl daemon-reload
sudo systemctl enable myscript.service

После следующей перезагрузки этот скрипт будет запущен автоматически. Обратите внимание, что для каждого скрипта, который вы собираетесь запускать должны быть правильно выставлены права, а именно нужно установить флаг выполнения. Для этого используйте команду chmod:

sudo chmod u+x /usr/local/bin/script

В параметрах мы передаем утилите адрес файла скрипта. Исполняемость - это обязательный параметр для всех способов.

Автозагрузка X сервера

Часто, в легких окружениях рабочего стола и оконных менеджеров для автозагрузки программ используется автозагрузка на уровне X сервера. Все запускаемые, таким образом, скрипты будут стартовать после запуска X сервера. Чтобы настроить такую автозагрузку Linux вам будет достаточно добавить путь к нужному скрипту в файл

/.xinitrc или /etc/X11/xinit/xinitrc. Синтаксис добавляемой строки таков:

exec путь_к_скрипту &

/.xinitrc еще не существует, то его нужно создать:

Затем, чтобы добавить в автозагрузку linux скрипт, отредактируйте файл так, как вам нужно. Например, будем запускать Firefox:


Готово. Осталось сохранить изменения. При следующем запуске X сервера сработает автозапуск Linux и выполняется эта команда. Таким же способом может выполняться автозапуск приложений linux.

Автозагрузка окружения рабочего стола

Такие мощные окружения рабочего стола как Gnome и KDE имеют свои приложения для автозагрузки. Например, в Gnome программа называется "Запускаемые автоматически приложения". Вы можете запустить ее из главного меню системы:


Здесь вы видите все программы, которые уже добавлены в автозагрузку. Вы можете отключить каждую из них просто сняв галочку.


Чтобы добавить новую программу или скрипт в автозагрузку нажмите кнопку "Добавить":


Тут вам нужно заполнить три поля:

  • Имя - произвольное имя для команды, по которому вы сможете ее найти;
  • Команда - полный путь к исполняемому файлу программы;
  • Комментарий - дополнительная информация, указывать необязательно.


Дальше нажмите "Добавить" ваша программа появится в списке. При следующей загрузке системы, будет выполняться автозагрузка программ linux.

Автозагрузка Bash

Самый простой автозапуск скрипта linux - это запуск с помощью bashrc. Ваш скрипт или команда будет выполняться каждый раз, когда запускается новая сессия терминала. Для этого добавьте адрес нужного скрипта в файл

/usr/bin/local/script
export MYWAR=test

Здесь вы можете запускать на выполнение любые скрипты или команды. Часто такой подход используется для создания псевдонимов команд, объявления новых переменных и собственных функций.

Выводы

В этой статье мы рассмотрели добавление в автозагрузку linux, а также как работает автозагрузка и ее виды. Конечно, существует множество других файлов, куда бы вы могли пристроить свой скрипт, но это будет неправильно. Нужно использовать только предназначенные для этого методы, хотя бы потому, чтобы потом не забыть. Если у вас остались вопросы, спрашивайте в комментариях!

Читайте также: