Este artículo fue publicado originalmente por mí en el blog de Web and Beer.
Solaris 10 incorpora SMF: Service Management Facility, que básicamente es un daemon que controla los servicios que corren en el sistema operativo. Su idea es reemplazar los scripts de /etc/init.d y /etc/rc.*.d, con una utilidad bastante más robusta y simple de configurar.
A partir de Solaris 10, entonces, vemos que muchos servicios que antes estaban en /etc/init.d ahora desaparecieron de allí y si revisamos el /etc/inittab vemos que una de las primeras cosas que hace es levantar el svc.startd que es el daemon que maneja los servicios de SMF. De hecho, dicen que ahora el boot es bastante más limpito, porque todos los mensajes de los servicios que se inician se van logueando en distintos lugares, y uno termina viendo algo así:
SunOS Release 5.10 Version Generic 64-bit Copyright 1983-2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Hostname: demobox NIS domain name is testlab.example.com checking ufs filesystems demobox console login:
En este link hay una Quickstart Guide muy interesante, donde muestra cómo se hacían las cosas en las versiones anteriores de Solaris y cómo deberían hacerse ahora con SMF: http://www.sun.com/bigadmin/content/selfheal/smf-quickstart.jsp
Subir y bajar el apache es tan sencillo como ejecutar los siguientes comandos:
Levantar: svcadm enable network/http:apache2
Bajar: svcadm disable network/http:apache2
Reiniciar: svcadm restart network/http:apache2
Como podrán observar, los servicios se agrupan en unidades más “user-friendly” (o admin-friendly), en vez de ser archivos tirados en directorios (de hecho en Solaris siempre era más molesto que en Linux, porque el archivo debía estar indefectiblemente en /etc/init.d y con hard links en /etc/rc3.d – para el caso de servicios que levantaran en runlevel 3). Además se pueden configurar facilmente variables de entorno y otras cosas locas que se deben inicializar con el servicio.
Por otro lado, al haber un daemon constantemente corriendo, si el servicio no es deshabilitado por un “restarter” habilitado, el servicio se levanta automáticamente:
[root@BOCUNOCDWB04:~]# svcadm enable network/http:apache2 [root@BOCUNOCDWB04:~]# ps -ef |grep httpd root 23319 1 3 13:38:59 ? 0:01 /usr/local/apache2/bin/httpd -k start -DSSL nobody 23328 23319 0 13:39:02 ? 0:00 /usr/local/apache2/bin/httpd -k start -DSSL root 23330 22786 0 13:39:04 pts/2 0:00 grep httpd nobody 23327 23319 0 13:39:02 ? 0:00 /usr/local/apache2/bin/httpd -k start -DSSL root 23322 1 0 13:39:01 ? 0:00 /usr/local/apache2/bin/httpd -k start -DSSL nobody 23326 23319 0 13:39:02 ? 0:00 /usr/local/apache2/bin/httpd -k start -DSSL nobody 23325 23319 0 13:39:02 ? 0:00 /usr/local/apache2/bin/httpd -k start -DSSL nobody 23324 23319 0 13:39:02 ? 0:00 /usr/local/apache2/bin/httpd -k start -DSSL [root@BOCUNOCDWB04:~]# pkill httpd [root@BOCUNOCDWB04:~]# ps -ef |grep httpd root 23357 1 0 13:39:22 ? 0:00 /usr/local/apache2/bin/httpd -k start -DSSL nobody 23360 23351 0 13:39:22 ? 0:00 /usr/local/apache2/bin/httpd -k start -DSSL root 23365 22786 0 13:39:22 pts/2 0:00 grep httpd root 23351 1 2 13:39:20 ? 0:01 /usr/local/apache2/bin/httpd -k start -DSSL nobody 23359 23351 0 13:39:22 ? 0:00 /usr/local/apache2/bin/httpd -k start -DSSL nobody 23361 23351 0 13:39:22 ? 0:00 /usr/local/apache2/bin/httpd -k start -DSSL nobody 23362 23351 0 13:39:22 ? 0:00 /usr/local/apache2/bin/httpd -k start -DSSL nobody 23363 23351 0 13:39:22 ? 0:00 /usr/local/apache2/bin/httpd -k start -DSSL [root@BOCUNOCDWB04:~]#
De la misma forma, si hay algún error al levantar el programa o el mismo se muere dejando algún error, el servicio es puesto en estado “maintenance”, para poder consultar posteriormente por qué no está corriendo.
[root@BOCUNOCDWB04:~]# svcs -xv network/http:apache2 svc:/network/http:apache2 (Apache 2 HTTP server) State: maintenance since Mon 14 Jul 2008 01:37:39 PM COT Reason: Start method failed repeatedly, last exited with status 1. See: http://sun.com/msg/SMF-8000-KS See: man -M /usr/apache2/man -s 8 httpd See: /var/svc/log/network-http:apache2.log Impact: This service is not running. [root@BOCUNOCDWB04:~]#
Para configurar los servicios hay una consola a la que podemos acceder con svccfg.
[root@BOCUNOCDWB04:~]# svccfg svc:> select network/http svc:/network/http> select apache2 svc:/network/http:apache2> listprop httpd application httpd/stability astring Evolving httpd/ssl boolean true network dependency network/entities fmri svc:/milestone/network:default network/grouping astring require_all network/restart_on astring error network/type astring service filesystem-local dependency filesystem-local/entities fmri svc:/system/filesystem/local:default filesystem-local/grouping astring require_all filesystem-local/restart_on astring none filesystem-local/type astring service autofs dependency autofs/entities fmri svc:/system/filesystem/autofs:default autofs/grouping astring optional_all autofs/restart_on astring error autofs/type astring service startd framework startd/ignore_error astring core,signal general framework general/enabled boolean true start method start/exec astring “/lib/svc/method/http-apache2 start” start/timeout_seconds count 60 start/type astring method stop method stop/exec astring “/lib/svc/method/http-apache2 stop” stop/timeout_seconds count 60 stop/type astring method refresh method refresh/exec astring “/lib/svc/method/http-apache2 refresh” refresh/timeout_seconds count 60 refresh/type astring method restarter framework NONPERSISTENT restarter/transient_contract count restarter/logfile astring /var/svc/log/network-http:apache2.log restarter/contract count 299148 restarter/start_pid count 23339 restarter/start_method_timestamp time 1216060760.150109000 restarter/start_method_waitstatus integer 0 restarter/auxiliary_state astring none restarter/next_state astring none restarter/state astring online restarter/state_timestamp time 1216060760.155996000 restarter_actions framework NONPERSISTENT restarter_actions/restart integer restarter_actions/maint_off integer svc:/network/http:apache2>
La forma en que el daemon manejará los servicios se define en un script que tiene “métodos”, que serán invocados por el daemon. Estos scripts están en /lib/svc/methods, y el daemon los llama por ejemplo de esta forma:
/lib/svc/methods/http-apache2 start
Adentro el método consulta algunas variables del servicio y lo levanta. El script es muy similar a los de /etc/init.d.
Con svcs se listan los servicios.
Con svcs -l se puede ver el estado actual de un determinado servicio. Además podes se puede ver el proceso principal y sus hijos:
% svcs -p network/smtp:sendmail
STATE STIME FMRI
online 18:20:30 svc:/network/smtp:sendmail
18:20:30 655 sendmail
18:20:30 657 sendmail
Y con svcs -x se puede ver por qué un determinado servicio falló.
Tiene muchas más cosas locas. Yo creo que debe tener alguna forma de controlar servicios remotos, porque cada servicio tiene una URI que llaman FMRI (Fault Managed Resource Identifier), que puede ser algo así:
- svc://localhost/system/system-log:default
- svc:/system/system-log:default
- system/system-log:default
Y en la primera opción justamente se define una location que en ese caso es localhost, pero supongo que uno podría poner una IP.
También hay otras cosas locas para el manejo de los runlevels del SO. Podés definir milestones que, si no entendí mal, serían como runlevels custom para los cuales vos podés definir qué servicios corren.
Más información sobre SMF en el System Administration Guide de Solaris: http://docs.sun.com/app/docs/doc/817-1985
Particularmente en estos dos capítulos:
http://docs.sun.com/app/docs/doc/817-1985/hbrunlevels-25516?a=view
http://docs.sun.com/app/docs/doc/817-1985/faauf?a=view
Cheat-sheet de SMF: http://www2.petervg.nl/quick_reference/SolarisSMF.pdf

2 Comentarios.