Запуск скрипта во время загрузки / запуска; init.d vs 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/Сценарии также запускаются в системах с поддержкой systemd для совместимости).

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

crontab(и, следовательно, @reboot).

  • cron выполнит любую обычную команду или скрипт, ничего особенного.
  • любой пользователь может добавить @rebootскрипт (не только root)
  • в системе Debian с systemd: @reboot 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!)

Что касается systemd network.targetи network-online.target, прочитайте Запуск сервисов после запуска сети .


В Ununtu 16.04 мне нужно /var/run/crond.rebootкаждый раз удалять файл, если я хочу, чтобы задания @reboot cron выполнялись при каждом запуске системы. Если этот файл существует, задания @reboot cron не будут выполнены
Альберт Катала

@ Albert-Catala отправь сообщение об ошибке в Ubuntu!
Франклин Пят

12

Во-первых, уточнение в порядке:

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

С точки зрения того, лучше ли использовать rc.localили cronзапускать сценарий, я подозреваю, что это больше вопрос эстетики, чем практичности. cron, как планировщик задач, предназначен в качестве метода для обслуживания или обслуживания компьютера, такого как проверка обновлений, очистка кэшей или выполнение проверок безопасности. Это не означает, что он ограничен выполнением этих функций, так как может запускать любой скрипт или команду в указанное время (например, @reboot).

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

Обе эти точки, однако, должны быть смягчены тем фактом, что не все системы инициализации предлагают rc.localмеханизм, и не все демоны cron предлагают @rebootтег psuedo.

Бонусные очки

Как уже упоминалось, init.dэто каталог, содержащий сценарии, управляющие службами, которые можно запускать или останавливать в вашей системе (по крайней мере, на компьютерах, использующих систему SysVтипа init). В зависимости от вашей системы инициализации и цели вашего скрипта, может быть целесообразно преобразовать ваш скрипт в скрипт инициализации, который будет запускаться так же, как служба. Это, однако, сильно зависит от вашей системы инициализации, так как среда, в которой создаются эти файлы, может сильно различаться.

Последнее слово

Следует также отметить, что обычно сценарии bash заканчиваются суффиксом .shвместо .txt, поскольку это сразу означает, что файл представляет собой сценарий оболочки, а не текстовый файл. При этом, если у него либо есть shebang ( #!/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.
поздравляет

3

Я пишу свой ответ ниже;

Q1: В чем основные различия между ними?

Помимо различий, упомянутых другими пользователями выше, я хотел бы подчеркнуть, что @reboot зависит от демона crond. Вы зависите от порядка запуска crond. Хотя в большинстве случаев, crond запускается нормально, но иногда может не запуститься (по крайней мере, я видел некоторые сбои в некоторых из моих проектов). Когда вы пишете сценарий инициализации, обычно происходит сбой, если вы что-то делаете неправильно в своем сценарии (например, полагаясь на службу, которая будет запускаться после вашей службы)

Q2: что является более надежным?

Исходя из вышеизложенного, я думаю, что init является более надежным. Но есть еще один момент, упомянутый «Франклином Пятом» в первом ответе. Обычно вам нужен скрипт инициализации для демона, и вы должны следовать политике

Q3: есть ли лучший из двух?

Я так не думаю (rc.local немного стар и устарел)

Q4: это правильный способ встраивания скрипта для запуска во время загрузки?

Да. Обычно авторы приложений / пакетов делают так.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.