Яка правильна заміна rc.local у systemd замість того, щоб створювати rc.local


25

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

Я знайшов вирішення цього питання - створити rc.local і надати йому дозволи на виконання.

printf '#!/bin/bash \n\nexit 0' >/etc/rc.local 
chmod +x /etc/rc.local

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

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


4
systemd "єдиний виграшний хід - це не грати"; альтернативно, залежно від того, що ви хочете, ви можете створити системний блок. Я б, мабуть, зараз використовував rc.local і дбав про нього, коли він пройде.
Rui F Ribeiro

Тож ви вважаєте, що офіційним способом є створення такого підрозділу, як служба? Будь ласка, опублікуйте як відповідь, як це зробити.
Лучано Андресс Мартіні

1
Коли я спробував Ubuntu, я створив підрозділ для постійного кешування ssh-агента на своєму робочому столі, поки я не перезавантажував і ще щось інше, я не можу згадати; Ви також можете створити один вказівник на /etc/rc.local, але, здається, система зараз робить це для себе .... Я б на даний момент rc.local, і якщо його припинено, створіть один, який вказує на підробку /etc/rc.local тоді.
Rui F Ribeiro

Це, ймовірно, порушить документацію так, ніби якась книга говорить про те, що потрібно щось поставити в /etc/rc.local, і ви намагаєтеся оновити ці документи, кажучи, наприклад, що rc.local повинен бути позначений як виконуваний, коли він стає повністю застарілим документація порушена, але якщо ви скажете, що ви повинні створити одиницю для вказівки на /etc/rc.local, ця брошура документації, оскільки systemd суперечить вашому пристрою. Я вважаю, що ви маєте рацію, вони, ймовірно, не вирішили, чи це застаріле чи ні, тому що вони все ще не мають заміни ... коли вони вирішать, що вся документація буде порушена знову.
Лучано Андресс Мартіні

Який сценарій потрібно виконати? У Systemd дуже багато типів одиниць. "Сервіс" - лише один із багатьох типів одиниць . Напр. Модулі кріплення, одиниці автоматичного обслуговування, таймери, цільові одиниці Чи міг би хтось із них вирішити вашу проблему?
andcoz

Відповіді:


17

Як було відзначено в іншому місці, він стає помірно нечистий для використання rc-local.serviceпід systemd.

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

rc-local.serviceчасто може добре працювати. Якщо ви турбуєтесь про вищезазначене, все, що вам потрібно зробити, - це зробити власну копію! Ось така магія:

# /etc/systemd/system/my-startup.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/libexec/my-startup-script

[Install]
WantedBy=multi-user.target

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

  1. Вам потрібно ввімкнути це за допомогою systemctl enable my-startup.service.

  2. Якщо ваш скрипт має залежність від будь-якої іншої послуги, в тому числі 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).

Є деякі міркування, які, на мою думку, стосуються і попередньої системи rc.local:

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

[*] Я використав Type=oneshot+, RemainAfterExit=yesтому що це має більше сенсу для більшості сценаріїв з одним знімком. Це формалізує, що ви запустите ряд команд, які my-startupбудуть показані як "активні", коли вони виконані, і що ви не заведете демон.


Що ж, є якесь "місцеве" місце для створення служб чи фрагментів, чи будь-що інше - чи я можу довіряти, що це місцеве, і його не слід змінювати? якщо я розвину свої власні демони? Оскільки я не хочу змінювати оригінальність системи, тому, коли я встановлюю apt-get, я не хочу бачити свою систему у спаленні через замінений сценарій, або щось подібне, наприклад. Я просто хочу довіритися, що демон буде розпочатий лише один раз, не роблячи ніяких додаткових шалених речей, яких я боюся ... як спробувати перезапустити його як нескінченне, якщо він зламаний і т.д. ...
Лучано Андресс Мартіні

1
@LucianoAndressMartini Якщо ви запитуєте, який правильний спосіб запустити демон, вам слід дійсно визначити для нього індивідуальну послугу. Це може бути нативним системним .serviceблоком, або якщо ви дійсно хочете написати скрипт ініціативи LSB, ви можете зробити це замість цього. Я не хотів рекомендувати вводити кілька демонів rc-local.serviceабо еквівалент, я думаю, що це, напевно, спрацьовує, але здається, що набагато приємніше, якщо ви можете перезапустити окремий демон так systemctl restart my-daemonсамо, як і все. Передбачається, що ви розміщуєте свої місцеві служби /etc/systemd/system.
sourcejedi

1
@LucianoAndressMartini вам потрібно уникати того самого імені, що і будь-який інший сервіс - як і в sysvinit. У подібних ситуаціях я іноді починав свої імена з local-...
sourcejedi

1
Дякую!!! Збережено через півдня. Ці деталі були для мене критичними: Type = oneshot, RemainAfterExit = так, Wants = network-online.target, After = network-online.target. Просто розгортання збірки apache та встановлення статичного IP-адреси на 192.168.1.80, щоб маршрутизатор міг направляти туди трафік. Повинно бути тривіальним. Це дратує Debian9. Навряд чи будь-яка порада в Інтернеті, окрім "apt-get apache", "systemctl start apache" або інструкцій з init.d, жодна з яких не застосовується для Apache, побудованого на джерелах під Debian9.
МайклсонБрітт

1
@MichaelsonBritt Найкраще не запускати тривалі програми,Type=oneshot відомі як демони з rc.local. Я використав ... це формалізує, що ... не будете заводити демон. Якщо ви хочете отримати інформацію про запуск демона, будь ласка, задайте нове запитання.
sourcejedi

15

Забудь про rc.local.

Як я вже говорив про CentOS 7 і про Debian 8 і про Ubuntu 15 :

Ви використовуєте операційну систему systemd + Linux. /etc/rc.local- це подвійний механізм сумісності ззаду назад у systemd, тому що це механізм сумісності ззаду для механізму, який був сам механізмом сумісності у клоні Van Smoorenburg System 5 rc.

Використання /etc/rc.localможе жахливо помилитися. Люди були здивовані тим фактом, що systemd працює не rc.localзовсім так, в тому самому місці в завантажувальному закладі, як раніше. (Або помилково очікуємо: насправді він не працював останнім у старій системі, як вказує посібник OpenBSD.) Інших здивувало те, що те, що вони створили, rc.localочікуючи на старі способи здійснення справ, - це потім повністю скасувати подібні нових udevправила, NetworkManager, systemd-logind, systemd-resolvedабо різний «Кіт» с.

Як пояснюється прикладом " Чому" init 0 "призводить до" Надлишкових аргументів "для Arch встановлюється? ", Деякі операційні системи вже надають systemd без зворотних функцій сумісності, таких як systemd-rc-local-generatorгенератор . Поки Debian все ще зберігає зворотні функції сумісності , Arch Linux будує системні з ними вимкнені . Так що в Arch та операційних системах, як це очікується, /etc/rc.local повністю ігноруються .

Забудь про rc.local. Це не шлях. У вас операційна система systemd + Linux. Тому створіть належний системний сервісний блок і не починайте з пункту, який знаходиться на двох рівнях відсталої сумісності. (В Ubuntu і Fedora, це три рази видалені, фургон Smoorenburg System 5 rcклон, а потім rc.localто , а потім вже сам двічі витіснили, більше десяти років тому, спочатку вискочкою , а потім Systemd.)

Також пам’ятайте перше правило переходу на systemd .

Це навіть не нова ідея, яка характерна для systemd. У системах Van Smoorenburg rcі Upstart слід зробити правильний rcсценарій van Smoorenburg або файл завдання Upstart, а не використовувати rc.local. Навіть у посібнику FreeBSD зазначається, що в наш час створюється правильний rcсценарій Mewburn замість використання /etc/rc.local. Mewburn rcбув представлений NetBSD 1.5 в 2000 році.

/etc/rc.localдатується часом сьомого видання Unix і раніше. У 1983 році він був заміщений /etc/inittabбазовим рівнем rcAT&T Unix System 3 (дещо інший /etc/inittabв AT&T Unix System 5) у 1983 році . Навіть що тепер історія.

Створіть належні визначення власних служб для вашої системи управління послугами, будь то пакет послуг для набору інструментів nosh service-managerі system-control, /etc/rc.d/сценарій для Mewburn rc, файл сервісного блоку для systemd, файл завдання для Upstart, каталог служб для runit / s6 / daemontools -ніше, або навіть /etc/init.d/сценарій для Ван Смооренбурга rc.

У системних системах такі файли сервісного блоку, додані адміністратором, /etc/systemd/system/зазвичай (або /usr/local/lib/systemd/system/рідко). З диспетчером служб нош /var/local/sv/- це звичайне місце для місцевих пакетів послуг. Mewburn rcна FreeBSD використовує /usr/local/etc/rc.d/. Упакований поодинокі службові файли і пакети послуг, якщо ви робите їх, йдуть в різних місцях, хоча.

Подальше читання


2
@LucianoAndressMartini Кращим питанням буде те, як обробити конкретний фрагмент rc.local у системній службі. Отже, якщо ви маєте на увазі конкретний фрагмент (ви згадуєте інструкції з документації щодо певного програмного забезпечення), можливо, замість цього залиште питання про це? Існують певні загальні правила, які можна використовувати для перетворення, але ви отримуєте більше від цього, використовуючи функції програмного забезпечення, яке ви запустите (наприклад, запуск на передньому плані, не намагаючись демонізувати тощо), тому запитуючи про конкретний випадок може бути корисним.
filbranden

4
Ви мусите замислитися, чи не витримала вона зведеність з 1983 року, можливо, у неї щось відбувається?
дан Картер

4
Ця відповідь є проповідницькою і насправді не відповідає простому запитанню "що дрібницька річ я повинен робити замість цього". Він може містити інформацію та надавати тонни посилань, але перемагає мету обміну стеками.
gps

Я доводжу це (кінець rc.local) разом з dns вирішенням проблем, як причини, чому Linux не еволюціонує, але насправді стає все більш і більше кодом спагетті, systemd стає для багатьох чорним полем. Якщо користувач або адміністратор хочуть помістити щось у rc.local і більше не може, не корисно спонукати їх спершу робити курси систематизовано або що інше ви проповідуєте, щоб досягти того самого кінцевого результату за дні, а не за хвилини. Звичайно, ідіоти можуть робити дурні речі з усім, що добре працює і з ним легко працювати, це ніколи не є вагомим аргументом для його припинення.
Юлій

2

Підсумок https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd

Створіть /etc/systemd/system/rc-local.service:

# /etc/systemd/system/rc-local.service
[Unit]
 Description=/etc/rc.local Compatibility
 ConditionPathExists=/etc/rc.local

[Service]
 Type=forking
 ExecStart=/etc/rc.local start
 TimeoutSec=0
 StandardOutput=tty
 RemainAfterExit=yes
 SysVStartPriority=99

[Install]
 WantedBy=multi-user.target

Потім:

sudo touch /etc/rc.local
sudo chmod +x /etc/rc.local
sudo systemctl enable rc-local

Перевірте:

sudo systemctl start rc-local.service
sudo systemctl status rc-local.service

Використовується система, що використовується StandardOutput=journal+console(консоль еквівалентна tty у вашому прикладі), що здається, що це було б набагато корисніше для усунення несправностей. Також підтримку для програми SysVStartPriority=було знято в якийсь момент. Можливо, ви могли б прокоментувати, наскільки це важливо SysVStartPriority=, або видалити його. Крім цього, це гідна відповідь.
sourcejedi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.