Запуск сценарію під час завантаження / запуску; init.d проти cron @reboot


48

На даний момент я намагаюся зрозуміти різницю між init.dі cron @rebootдля запуску сценарію при запуску / завантаженні системи.

Використання @reboot(цей метод був згаданий в цьому форумі по hs.chandra ) є те , що деякі простіше, просто входячи в crontab -eі створюючи , @reboot /some_directory/to_your/script/your_script.txtа потім your_script.txtбуде виконуватися кожного разу при завантаженні системи. В глибині пояснення @rebootзнаходиться тут

Крім того, вставивши /etc/init.d/your_script.txtу другий рядок сценарію, тобто:

#!/bin/bash
# /etc/init.d/your_script.txt

Ви можете запустити, chmod +x /etc/init.d/your_script.txtі це також повинно призвести your_script.txtдо запуску кожного разу при завантаженні системи.

Q1: Які ключові відмінності між ними?
Q2: Що надійніше?
Q3: Чи є кращий з двох?
Q4: Це правильний спосіб вбудовування сценарію під час завантаження?

Я буду включати bash .sh файл для запуску під час запуску.


2
Також важливим є Systemd, link1 link2
Руфус

Відповіді:


37

init.d, також відомий як сценарій SysV, призначений для запуску та зупинки служб під час ініціалізації та відключення системи. ( /etc/init.d/сценарії також виконуються на системних системах для сумісності).

  • Сценарій виконується під час завантаження та відключення (за замовчуванням).
  • Сценарій повинен бути сценарієм init.d, а не лише сценарієм. Він повинен підтримувати startта stopбагато іншого (див. Політику Debian )
  • Сценарій може бути виконаний під час завантаження системи (ви можете визначити, коли).

crontab(і тому @reboot).

  • cron буде виконувати будь-яку звичайну команду чи сценарій, нічого особливого тут немає.
  • будь-який користувач може додати @rebootскрипт (не лише root)
  • в системі Debian з systemd: під час виконання @ronboot cron виконується протягом multi-user.target.
  • у системі Debian із системою SysV (не systemd), crontab (5) згадуйте: Зауважте, що запуск, що стосується @reboot, - це час запуску демона cron (8). Зокрема, це може бути до запуску деяких демонів системи чи інших засобів. Це пов’язано з послідовністю порядку завантаження машини.
  • легко планувати один і той же сценарій під час завантаження та періодично.

/etc/rc.localчасто вважається некрасивим або застарілим (принаймні від redhat ), але він мав деякі приємні риси:

  • rc.local виконає будь-яку звичайну команду чи сценарій, нічого особливого тут.
  • в системі Debian з SysV (не systemd): rc.localбув (майже) останнім сервісом, який запустився.
  • але в системі Debian з systemd: rc.localвиконується після network.targetза замовчуванням (не network-online.target!)

Щодо системних систем network.targetта network-online.targetчитайте Запуск служб після запуску мережі .


У моїй Ununtu 16.04 мені потрібно /var/run/crond.rebootкожного разу видаляти файл, якщо я хочу виконувати завдання @reboot cron кожного разу при запуску системи. Якщо цей файл існує @reboot cron завдання не будуть виконані
Альберт Катала

@ Альберт-Катала подає помилку в Ubuntu!
Франклін Піат

12

По-перше, уточнення в порядку:

  • init.d - це каталог, в якому зберігаються скрипти управління службами, які керують запуском та зупинкою таких служб, як httpdабоcron
  • rc.local - це сервіс, який дозволяє запускати довільні сценарії як частину процесу запуску системи

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

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

Однак, обидва ці моменти повинні бути загартовані тим, що не всі системи init пропонують rc.localмеханізм, і не всі демони cron пропонують @rebootтег psuedo.

Бонусні бали

Як уже згадувалося, init.dце каталог, який містить сценарії, які керують службами, які можна запустити або зупинити у вашій системі (принаймні, на машинах, які використовують систему SysVinit типу). Залежно від вашої системи init та мети вашого скрипту, можливо, буде розумним перетворити свій скрипт у сценарій init, який запускається так само, як послуга. Це, однак, сильно залежить від вашої системи init, оскільки структура, що будує ці файли, може сильно відрізнятися.

Останнє слово

Слід також зазначити, що, як правило, сценарії bash закінчуються суфіксом, .shа не .txt, оскільки це відразу позначає, що файл є скриптом оболонки замість текстового файлу. Однак, за умови, що він або має шебанг ( #!/bin/bash) у верхній частині файлу, або називається так bash /path/to/script.whatever, це не має значення в плані виконання сценарію.


bashсценарії, як правило, не закінчуються розширенням (і, мабуть, не повинні)sh .
mikeserv

1
@mikeserv: Хоча я згоден, що більшість скриптів bash не мають (і, мабуть, не повинні) розширення, зазвичай файли з розширенням ".sh" є скриптами bash - див. "Що таке файл .sh?" .
Девід Кері

@DavidCary - це не здається дуже авторитетним джерелом.
mikeserv

1
Вікіпедія: "список розширень імен файлів" та Вікіпедія: "скрипт оболонки" також згадують напрочуд поширене розширення ".sh" із посиланнями.
Девід Кері

1
" типово bash-скрипти закінчуються суфіксом, .shа не.txt " - конкретно, значення shбільш точне, як розширення імені файлу для скриптів bash (або інших скриптів оболонки), ніж те, txtщо зазвичай позначає звичайний текст. Ви можете використовувати будь-яке розширення, яке вас хихикає, але загальна умова була б, якщо використання розширення shбуло б більш доречним і зазвичай використовується; хоча це не потрібно, особливо для скриптів, які призначені для виконання з PATH.
1515

3

Я пишу свою відповідь нижче;

Q1: Які ключові відмінності між ними?

Окрім відмінностей, про які згадували інші користувачі вище, я хотів би підкреслити те, що @reboot залежить від демона врожаю. Ви залежні від порядку, в якому починається обрізка. Незважаючи на те, що в більшості випадків, кронда починається нормально, але він може не вдатися колись (принаймні, я бачив деякі збої в деяких своїх проектах). Коли ви пишете сценарій init, помилка, як правило, трапляється, якщо ви робите щось не так у своєму сценарії (наприклад: покладаючись на послугу, яка запуститься після вашої служби)

Q2: Що надійніше?

Виходячи з вищесказаного, я вважаю, що init є більш надійним. Але є ще один момент, про який згадував "Франклін Піт" у першій відповіді. Зазвичай вам потрібен сценарій init для демон, і ви повинні слідувати політиці

Q3: Чи є кращий з двох?

Я не вважаю так (rc.local трохи старий і застарілий)

Q4: Це правильний спосіб вбудовування сценарію під час завантаження?

Так. Зазвичай автори програм / пакунків роблять таким чином.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.