Вход:  Пароль:  
FreeSource: DmitrijMaslennikov/porting ...
Free Source | Каталог | Изменения | НовыеКомментарии | Пользователи | Регистрация |

Идея сохранения совместимости


Сейчас у нас имеются скрипты в директории /etc/rc.d/init.d (и симлинк /etc/init.d -> /etc/rc.d/init.d). Каждый скрипт выполняет определенную функцию при старте системы (ну почти каждый, есть несколько вспомогательных), некоторые и при остановке, а некоторые, те кто отвечают за запуск программ-демонов, еще позволяют заставить соответствующее приложение перечитать свою конфигурацию. Это выполняется командами


/etc/init.d/<service> start
/etc/init.d/<service> stop
/etc/init.d/<service> reload


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


У init-ng аналогичные по функциям скрипты лежат в /etc/initng. При этом их можно распределять под подкаталогам, так как init-ng ищет свои ifiles (так называются эти скрипты) рекурсивно. Поэтому я предлагаю все скрипты соответствующие прежним /etc/init.d/<service> помещать в /etc/initng/init/<service>, чтобы отличать их от остальных, которые тоже понадобятся.


init-ng ifiles поддерживают только два действия start и stop (еще есть действия вроде restart — комбинация stop/start, zap — сброс статуса из запущенного на незапущенный и др., но все они не имеют отражения в ifiles). Дополнительные действия можно добавить плагинами на С, но это цель на будущее, если сильно потребуется. Поэтому первое, что приходит в голову, это написать /etc/initng/init/<service> в виде



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


Написанные таким образом скрипты уже позволят нам загружаться и останавливать систему. Но они приносят некоторые проблемы. Например, мы захотели остановить сервис httpd, но забыли, что у нас init-ng и выполнили по старинке:


$/etc/init.d/httpd stop


Сервис будет остановлен, но initng об этом не узнает и при попытке снова его запустить скажет, что он уже запущен или при выключении попытается остановить его повторно. Можно придумать и много других нежелательных вещей, которые произойдут при таком прямом обращении. Я бы не вел об этом речь, если бы не было выхода. А выход простой. Все скрипты в /etc/init.d написаны на sh (bash), это очень удобно. Как и при профилировании можно заменить интерпретатор на наш.


Что будет делать такой интерпретатор? При запуске он должен проверять тип используемого init процесса. Если это обычный /sbin/init, то просто запускаем bash с теми же аргументами, что и наш скрипт. Этим мы гарантируем совместимость со старым типом запуска. Если же у нас init-ng, то сначала мы смотрим на действие, которое мы должны совершить. Если это не start или stop, то запускаем bash с нашими аргументами и выполняем действие, если же это start или stop, то мы должны дополнительно проверить наличие признака (переменной окружения), свидетельствующего, что скрипт запускается не прямым вызовом, а с помощью init-ng, если это так, то мы тоже запускаем bash. Если же признака нет, то вместо выполнения скрипта необходимо попросить init-ng сделать это и он уже запустит этот скрипт повторно сам. Скрипт для initng теперь становится следующим:



То есть добавляем признак запуска из initng. А бинарник-враппер так же достаточно тривиален, но приводить здесь его неудобно, а файлы заливать как всегда некуда. Пока все.


Страницы, ссылающиеся на данную: DmitrijMaslennikov
ТЗ/initscripts



 
Файлов нет. [Показать файлы/форму]
Комментариев нет. [Показать комментарии/форму]