Обновлена 25.07.2013
При установке разного рода приложений, разработчики не всегда уделяют внимание на создание скрипта запуска и тем более занесения его в SMF. В данной статье я покажу пример создания сервиса для mysql и nagios.
Примечание.
1) Существует и интерактивный способ создания – через утилиту manifold.
2) Для Solaris 11.1 появился встроенный механизм – svcbundle
Тестовый стенд: Solaris 11, Solaris 11.1
Solaris 11.1
Допустим, наш сервис должен запускаться вот так:
# /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg
Тогда команда создания манифеста выглядит так:
# svcbundle -o /lib/svc/manifest/site/nagios.xml -s service-name=application/nagios -s model=daemon -s start-method="/usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg"
Теперь остаётся только перезапустить службу импорта манифестов и сервис готов:
# svcadm restart manifest-import
# svcs nagios
STATE STIME FMRI
online 2:13:01 svc:/application/nagios:default
# ps -ef | grep nagios
nagios 25743 1 0 00:50:43 ? 0:06 /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg
А можно всё сделать и одной командой, используя параметр “-i” (при этом сервис импортируется куда надо и перезапуститься служба manifest-import):
# svcbundle -i -s service-name=application/nagios -s model=daemon -s start-method="/usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg"
Solaris 11
1) Предустановки
Я качал mysql5.5.19 с официального сайта для и ставил через pkgadd. Сам mysql установлен в каталог /opt/mysql/mysql.
2) Создания манифеста.
Создадим папку, где будет лежать наш манифест:
#mkdir /var/svc/manifest/application/database
и в этой папке создадим манифест mysql.xml такого содержания:
<?xml version="1.0"?> <!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1"> <!-- Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. pragma ident "@(#)server.xml 1.2 04/08/09 SMI" --> <service_bundle type='manifest' name='mysql'> <service name='application/database/mysql' type='service' version='1'> <dependency name='network' grouping='require_all' restart_on='none' type='service'> <service_fmri value='svc:/milestone/network:default' /> </dependency> <dependency name='filesystem-local' grouping='require_all' restart_on='none' type='service'> <service_fmri value='svc:/system/filesystem/local:default' /> </dependency> <exec_method type='method' name='start' exec='/lib/svc/method/mysql start' timeout_seconds='60' /> <exec_method type='method' name='stop' exec='/lib/svc/method/mysql stop' timeout_seconds='60' /> <instance name='version_55' enabled='false'> <method_context> <method_credential user='mysql' group='mysql' /> </method_context> <property_group name='mysql' type='application'> <propval name='bin' type='astring' value='/opt/mysql/mysql/bin' /> <propval name='data' type='astring' value='/opt/mysql/mysql/db' /> </property_group> </instance> <stability value='Evolving' /> <template> <common_name> <loctext xml:lang='C'> MySQL RDBMS </loctext> </common_name> <documentation> <manpage title='MySQL 5.5.19' section='1' /> <doc_link name='mysql.com' uri='http://dev.mysql.com/docs' /> </documentation> </template> </service> </service_bundle>
Обязательно проверьте переменные в этом скрипте и если они отличаются от ваших – исправьте.
3) Импорт манифеста.
Что бы наш сервис появился в svcs -a добавим манифест mysql:
#svccfg import /var/svc/manifest/application/database/mysql.xml
#svcs -a | grep mysql
disable 13:11:49 svc:/application/database/mysql:version_55
Если после импорта вы вспомнили, что забыли что-то изменить, то внести изменения можно 2-мя способами:
– через svccfg
– изменить манифест и импортировать заново
4) Создание стартового скрипта.
Создадим скрипт управления сервисом (запуск\перезапуск) /lib/svc/method/mysql такого содержания:
getproparg() { val=`svcprop -p $1 $SMF_FMRI` [ -n "$val" ] && echo $val } MYSQLBIN=`getproparg mysql/bin` MYSQLDATA=`getproparg mysql/data` PIDFILE=${MYSQLDATA}/`/usr/bin/uname -n`.pid if [ -z $SMF_FMRI ]; then echo "SMF framework variables are not initialized." exit $SMF_EXIT_ERR fi if [ -z ${MYSQLDATA} ]; then echo "mysql/data property not set" exit $SMF_EXIT_ERR_CONFIG fi if [ ! -d ${MYSQLDATA} ]; then echo "mysql/data directory ${MYSQLDATA} is not a valid MySQL data directory" exit $SMF_EXIT_ERR_CONFIG fi if [ ! -d ${MYSQLDATA}/mysql ]; then ${MYSQLBIN}/mysql_install_db --user=mysql --datadir=${MYSQLDATA} fi mysql_start() { echo ${MYSQLBIN}/mysqld --user=mysql --datadir=${MYSQLDATA} --pid-file=${PIDFILE} ${MYSQLBIN}/mysqld --user=mysql --datadir=${MYSQLDATA} --pid-file=${PIDFILE} > /dev/null & } mysql_stop() { if [ -f ${PIDFILE} ]; then pkill mysqld fi } case "$1" in 'start') mysql_start ;; 'stop') mysql_stop ;; \*) echo "Usage: $0 {start|stop}" exit 1 esac exit $SMF_EXIT_OK
и присвоим ему права 555.
5) Запуск
Теперь можно запустить mysql:
#svcadm enable mysql
# svcs -a | grep mysql
online 13:11:49 svc:/application/database/mysql:version_55
Примечание.
В 11.2 появился механизм svcio, позволяющий создавать текстовые файлы на основе свойств сервисов. А так же smf_stencil – определяет отношение между этими текстовыми файлами и свойствами сервиса.