Ваше приложение все еще запускается из rc-скрипта? Давайте конвертируем его в smf службу.
Предположим для примера, что ваш скрипт запускает некую java-программу, слушающую порт 5000.
Вот его содержимое, исправленное для использования с smf:
# cat /lib/svc/method/jserver
#!/bin/sh
. /lib/svc/share/smf_include.sh
NAME="JServer"
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/opt/java/bin
JAVA=/usr/bin/java
JAR="/opt/test/jserv.jar"
OPTIONS="5000"
USER="pupkin"
case "$1" in
start)
su - $USER -c "$JAVA -jar $SERVER $OPTIONS &" >/dev/null
;;
stop)
pkill -f -u $USER "$JAVA -jar $SERVER $OPTIONS"
;;
restart)
$0 stop
sleep 3
$0 start
;;
status)
echo "Status of $DESC: $NAME "
if [ `pgrep -f -u $USER "$JAVA -jar $SERVER $OPTIONS"` ]
then echo "Running"
else echo "Stopped"
fi
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac
exit $SMF_EXIT_OK
Вначале нам нужно создать простейший SMF манифест в формате xml и описать в нем запуск и остановку службы:
# cat jserver.xml
<div style="background: #CCCCCC; color: #000000; margin: 20px;">
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
<service_bundle type=’manifest’ name=’jserver’>
<service
name=”network/jserver”
type=”service”
version=”1″>
<create_default_instance enabled=”true”/>
<exec_method
type=’method’
name=’start’
exec=’/lib/svc/method/jserver start’
timeout_seconds=’0′>
<exec_method
type=’method’
name=’stop’
exec=’/lib/svc/method/jserver stop’
timeout_seconds=’3′>
</exec_method>
<exec_method
type='method'
name='refresh'
exec='/lib/svc/method/jserver restart'
timeout_seconds='6' />
</exec_method>
</service>
</service_bundle>
Мы создали самый простой манифест, для подробностей можете изучить содержимое xml-файлов в /var/svc/manifest.
После этого проверяем xml-структуру с помощью svccfg:
# svccfg validate jserver.xml
Если ошибок нет, импортируем манифест в SMF репозиторий:
# svccfg import jserver.xml
Теперь можно посмотреть свойства нашей новой службы:
# svccfg -s network/jserver listprop
start method
start/exec astring "/lib/svc/method/jserver start"
start/timeout_seconds count 0
start/type astring method
stop method
stop/exec astring “/lib/svc/method/jserver stop″
stop/timeout_seconds count 3
stop/type astring method
refresh method
refresh/exec astring "/lib/svc/method/jserver restart"
refresh/timeout_seconds count 6
refresh/type astring method
Теперь удаляем S и K линки rc-скрипта из /etc/rc..d директорий и запускаем нашу службу:
# svcadm enable network/jserver
В случае каких-либо проблем можно взглянуть на лог запуска службы:
# cat /var/svc/log/network-jserver:default.log