How to add a service to Solaris‘ SMF architecture (with example for rsyncd)
Write a manifesto
[root@sol2 FILER /root]# cat /var/svc/manifest/network/rsync.xml <?xml version="1.0"?> <!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1"> <service_bundle type="manifest" name="rsync"> <service name="network/rsync" type="service" version="1"> <create_default_instance enabled="false"/> <single_instance/> <dependency name="net-loopback" grouping="require_all" restart_on="none" type="service"> <service_fmri value="svc:/network/loopback"/> </dependency> <dependency name="net-physical" grouping="require_all" restart_on="none" type="service"> <service_fmri value="svc:/network/physical"/> </dependency> <dependency name="config_data" grouping="require_all" restart_on="restart" type="path"> <service_fmri value="file://localhost/etc/rsyncd.conf"/> <service_fmri value="file://localhost/etc/default/rsync"/> </dependency> <exec_method type="method" name="start" exec="/lib/svc/method/rsync %m" timeout_seconds="30"> </exec_method> <exec_method type="method" name="restart" exec="/lib/svc/method/rsync %m" timeout_seconds="30"> </exec_method> <exec_method type="method" name="stop" exec="/lib/svc/method/rsync %m" timeout_seconds="30"> </exec_method> <template> <common_name> <loctext xml:lang="C"> Rsync Service </loctext> </common_name> </template> </service> </service_bundle>
Write a method
[root@sol2 FILER /root]# cat /lib/svc/method/rsync #!/usr/bin/bash set -e # /lib/svc/method/rsync: start and stop the RSYNC daemon DAEMON=/usr/local/bin/rsync RSYNC_ENABLE=false RSYNC_OPTS= RSYNC_DEFAULTS_FILE=/etc/default/rsync RSYNC_CONFIG_FILE=/etc/rsyncd.conf PIDFILE=/var/run/rsyncd.pid test -x $DAEMON || exit 0 if [ -s $RSYNC_DEFAULTS_FILE ]; then . $RSYNC_DEFAULTS_FILE case "x$RSYNC_ENABLE" in xtrue|xfalse) ;; xinetd) exit 0 ;; *) echo "Value of RSYNC_ENABLE in $RSYNC_DEFAULTS_FILE must be either 'true' or 'false';" echo "not starting rsync daemon." exit 1 ;; esac fi export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" case "$1" in start) if "$RSYNC_ENABLE"; then echo -n "Starting rsync daemon: rsync" if [ -s $PIDFILE ] && kill -0 $(cat $PIDFILE) >/dev/null 2>&1; then echo " apparently already running." exit 0 fi if [ ! -s "$RSYNC_CONFIG_FILE" ]; then echo " missing or empty config file $RSYNC_CONFIG_FILE" exit 1 fi $DAEMON --daemon --config="$RSYNC_CONFIG_FILE" $RSYNC_OPTS echo "." else if [ -s "$RSYNC_CONFIG_FILE" ]; then echo "rsync daemon not enabled in /etc/default/rsync" fi fi ;; stop) if [ -s $PIDFILE ] && kill -0 $(cat $PIDFILE) >/dev/null 2>&1; then echo -n "Stopping rsync daemon: rsync" /usr/bin/kill -TERM `/usr/bin/cat $PIDFILE` rm -f $PIDFILE echo "." fi ;; reload|force-reload) echo "Reloading rsync daemon: not needed, as the daemon" echo "re-reads the config file whenever a client connects." ;; restart) # set +e if $RSYNC_ENABLE; then echo -n "Restarting rsync daemon: " if [ -s $PIDFILE ] && kill -0 $(cat $PIDFILE) >/dev/null 2>&1; then /usr/bin/kill -TERM `/usr/bin/cat $PIDFILE` rm -f $PIDFILE echo -n "." fi if [ ! -s "$RSYNC_CONFIG_FILE" ]; then echo " missing or empty config file $RSYNC_CONFIG_FILE" exit 1 fi sleep 5 $DAEMON --daemon --config="$RSYNC_CONFIG_FILE" $RSYNC_OPTS if [ $? -ne 0 ]; then echo "start failed? $?" rm -f $PIDFILE else echo "." fi else echo "rsync daemon not enabled in /etc/default/rsync" fi ;; *) echo "Usage: /etc/init.d/rsync {start|stop|reload|force-reload|restart}" exit 1 esac exit 0
Validate and import
svccfg validate /var/svc/manifest/network/rsync.xml svccfg import /var/svc/manifest/network/rsync.xml
Configure
svcadm enable svc:/network/rsync svcs -xv
This article was based on the now-dead blog post: http://blogs.sun.com/ritu/entry/how_to_configure_mysql_to