Обновлена 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 – определяет отношение между этими текстовыми файлами и свойствами сервиса.