persistent process supervision
perpetrate(5)           persistent process supervision           perpetrate(5)

       perpetrate - conventions for runscripts

       perpd(8)  operates  on  a  pair  of ``runscripts'' that are executed to
       start and reset a service and an optional logger.

       The runscripts recognized by perpd(8) are:

              Optional.  Controls the logger for the main service.

              Required.  Controls the main service.

       The arguments, structure, and conventions for rc.log  and  rc.main  are
       identical.  The illustrations below will usually be shown with rc.main,
       but are equally applicable to rc.log unless noted otherwise.

       perpd(8) will invoke service runscripts from within the service defini-
       tion directory.  For example, given some service definition directory


       perpd(8)  will switch into foo before invoking a runscript.  This means
       that foo will be the current working  directory  within  the  runscript

       Runscripts  are  normally implemented as executable shell scripts, pre-
       pared and installed by the system administrator.  A runscript  will  be
       executed at least twice during the life cycle of a service:

              o   to start the service

              o   after the service exits

       A  runscript  will  accordingly be structured to handle either of these

       Runscripts are invoked in the general form:

              ./rc.main target svname [ args...  ]

       The argument target will be set to one of two literal  strings,  either
       ``start''  or  ``reset'',  depending on whether perpd(8) is starting or
       resetting the service.  The svname argument will be set to the basename
       of  the  service  definition directory, such as ``foo'' for the service
       directory foo.  Any additional arguments depend on the target.

       When using a ``start'' target, perpd(8) will invoke the runscript  like

              ./rc.main start svname

       This  follows  the  general form with no additional arguments.  Given a
       ``start'' target, a runscript process should  perform  any  initializa-
       tions  the  service  requires,  and then proceed to replace itself (its
       process ID) with the desired service  running  in  the  foreground.   A
       Bourne-compatible script such as sh(1) will replace itself by using the
       exec command to start the service.  This  provides  perpd(8)  with  the
       process ID it needs for the actual running service, so that the service
       may be properly monitored and controlled.

       Normally the ``start'' target will result in a  persistent  process,  a
       long-running  program  that  starts  at system boot and continues until
       system shutdown.  A runscript called with  a  ``start''  target  should
       generally  not return or exit, unless some error is encountered in ini-
       tializing or starting the service.

       As long-running as a service may be, whenever it  does  exit,  for  any
       reason, perpd(8) will call the runscript again with a ``reset'' target.
       A ``reset'' target will invoke the runscript with additional  arguments
       in  either  one  of  two forms, depending on whether the service exited
       normally, or was terminated by a signal:

              ./rc.main reset svname exit exitcode
              ./rc.main reset svname signal signum signame

       In the first case, where a service has terminated normally,  the  addi-
       tional  arguments  include