Сценарії init.d написані на Python


10

На StackOverflow виникло запитання про запис init.dсценаріїв у Python. В одному коментарі було вказано, що ці сценарії повинні програмуватися в оболонці, а не в Python. Пише init.dсценарії в Python:

  1. Поганий. Поганий. Поганий. Ніколи цього не робіть.
  2. Не рекомендована практика.
  3. Гаразд, із застереженнями.
  4. Спадкова догма.
  5. Зовсім добре.

Було б чудово знати будь-які сценарії кошмару, або якщо це правило записане в крові деяких сисадмінів.

Відповіді:


9

Я б сказав, що №2, але дуже близько до №1 - "Погано. Погано. Погано. Ніколи цього не роби". Стандартний, такий, як він, для Linux скриптів init є в LSB , і, хоча він ніколи не виходить і каже, що "це сценарії оболонок", робиться кілька припущень. Перший, що рядки, що починаються з #, - це коментарі, виходить добре. Більш проблематичною є вимога, щоб скрипт init виконував команди з /lib/lsb/init-functions"у поточному середовищі (див. Спеціальну вбудовану командну точку оболонки)".

Але ще важливіше, якщо ви робите тут щось справді складне, ви робите це неправильно. Сценарії init повинні бути дуже простими та корисними. Вони повинні бути сценаріями в класичному розумінні, а не програмами. Краще висмоктати його і скласти простий скрипт оболонки, щоб будь-який sysadmin легко міг за один швидкий погляд, ніж зробити щось красиве і спроектоване на Python.

systemdСлід пам’ятати про те , що може бути, а може, і не бути майбутнім ініціалізації системи на Linux У режимі systemd ініціалізація виконується простими файлами конфігурації, а не скриптами, ідея полягає в тому, що всі запуски вписуються в кілька стандартних моделей дизайну, і вам дійсно потрібно просто вибрати один. Якщо програма використовує щось складне для ініціалізації, це повинно виходити за межі самого сценарію init.


1
Я йду з цією відповіддю. Справа в тому, що Python не потрібен і не є стандартним, і як такий він може створити додаткову точку налагодження невизначеності та додаткову точку відмови. Посилаючись на оригінальне запитання про те, я вважаю, що такі сценарії можуть запускати демони, але вони не повинні бути власне демонами.
mjhm

якщо я пам’ятаю, не всі дистрибутиви слідують за LSB. див. debian.
Массімо

10

Я не бачу з цим проблеми, якщо ви точно знаєте, що інтерпретатор Python буде доступний під час запуску скрипта init.d. Це, на мене, вказує на те, що ви дивитесь на те, що робиться відносно пізно на багатокористувацькому (або "графічній консолі") рівні запуску.

Однак ... Це означає, що певна версія інтерпретатора Python МОЖЕ бути життєво важливою для вашої завантажувальної послідовності, і це ще один елемент, який потрібно перевірити при оновленнях.

Я думаю, це означає, що я кажу "3. Добре, із застереженнями".


4
+1. Саме те, що я писав. Єдиними "проблемами" тут є переконання, що ви відповідаєте LSB, (наприклад, надання необхідних функцій) та переконайтеся, що потрібний вам інтерпретатор python доступний під час виконання (а не порушений.)
Sam Halicke

3
Доступні під час виконання програми можуть бути складними, якщо користувач вирішив мати / usr на окремому розділі. Важливо, щоб ваш сценарій запускався після / usr встановлений, оскільки python, як правило, встановлений в / usr.
Зоредаче

@Zoredache - Ayup. Як правило, ви знаєте, що "трапилося", коли ви запізнюєтесь у "багатокористувацькій" послідовності RC.
Ватін

2

Я погоджуюся з "3. Добре, із застереженнями", але з різних причин. Мій досвід роботи Solaris полягав у тому, що вони мали копію ОС Perl для деяких своїх внутрішніх програм. Сценарій оболонки був не що інше, як оболонка, щоб змусити Perl стартувати. Чи потрібно було писати сценарій запуску ш? Ні, але це покращило ремонтопридатність для адміністратора. І сценарій init нічого складнішого не робив, наприклад, daemon --startабо daemon --stop. Якщо ви це зробили, то постійні користувачі можуть запускати ваш інструмент у непривілейованому режимі, якщо це має сенс у контексті вашої програми. І їм не потрібно мати всілякі складні налаштування для тонкості.

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

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


1

Я кажу між №1-2. LSB направляє вас таким чином .. і з Sys-Admin (не-рольова роль) завдання req диктує знання sh / bash, а не на рівні розробки (або навіть легкого розуміння) python, PHP або perl. Це для стека LAMP, а не для скриптів init системи.

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