"epilogue" script?

Valeri Galtsev galtsev at kicp.uchicago.edu
Sat Jan 30 15:34:18 UTC 2016

On Sat, January 30, 2016 8:19 am, Ian Smith wrote:
> In freebsd-questions Digest, Vol 608, Issue 6, Message: 20
> On Sat, 30 Jan 2016 11:59:55 +0100 Polytropon <freebsd at edvax.de> wrote:
>  > On Fri, 29 Jan 2016 16:35:07 -0600 (CST), Valeri Galtsev wrote:
>  > > Dear Experts,
>  > >
>  > > How does one create "epoligue" script in FreeBSD. By "epoligue"
> script
>  > > script I mean here the script that is executed after everything
> described
>  > > in /etc/rc.conf is done (services started, interfaces initialized
> etc.). I
> [..]
>  > a) RC framework: rc.d
>    [..]
>  > See "man rc" and "man rcorder" for details.
> Sure, if installing new daemon processes, this is the way to go.
> OTOH, for scripts needing running just once at startup, and/or possibly
> once at shutdown:

Thanks to everybody who answered, you answers were very instructive! And
special thanks to Mr Polytropon and Mr Smith! Being quite long on this
list I have noticed that after reading your posts my knowledge improves as
after reading a chapter of a good book on the subject. Which leads me to
realizing that that is exactly what I had to do a few years ago, when I
migrated servers to FreeBSD: read a good book, and there were several
recommended on this list some time ago, so this is what I'll do next (plus
man on all things you all have mentioned).

>  > b) rc.local and rc.shutdown.local
>  >
>  > Those files, located in /etc, are "real" shell scripts that will be
>  > executed "quite late", but not at the lastest possible point. Here
>  > is an example:
>  >
>  > 	Creating and/or trimming log files.
>  > 	Starting syslogd.
>  > 	No core dumps found.
>  > 	Additional ABI support: linux.
>  > 	Starting named.
>  > 	Clearing /tmp (X related).
>  > 	Starting local daemons: activity.	<--- /etc/rc.local runnung now!
>  > 	Starting ntpd.
>  > 	Starting dhcpd.
>  > 	Starting cupsd.
>  > 	Configuring syscons: keymap keyrate font8x16 font8x14 font8x8.
>  > 	Starting sshd.
>  > 	Starting cron.
>  > 	Starting inetd.
>  >
>  > As you can see, there are other services started _after_ rc.local has
>  > been run. This might cause a problem for you when you need those
> services
>  > running.
> Yes.  I was preparing to post a very similar segment, which also wrote
> something to stdout when /etc/rc.local was sourced - so thanks!
>  > See from "man rc":
>  >
>  > 	The rc.local script contains commands which are pertinent only
>  > 	to a specific site.  Typically, the /usr/local/etc/rc.d/ mechanism
>  > 	is used instead of rc.local these days but if you want to use
> rc.local,
>  > 	it is still supported.  In this case, it should source /etc/rc.conf
>  > 	and contain additional custom startup code for your system.  The best
>  > 	way to handle rc.local, however, is to separate it out into rc.d/
>  > 	style scripts and place them under /usr/local/etc/rc.d/. The rc.conf
>  > 	file contains the global system configuration information referenced
>  > 	by the startup scripts, while rc.conf.local contains the local system
>  > 	configuration.  See rc.conf(5) for more information.
>  >
>  > So this might not be "stable".
> It's stable; been there since the dawn of time and isn't going away :)
> Valeri, picking up on the above, if you run, say:
>  % rcorder /etc/rc.d/* /usr/local/etc/rc.d/* | less
> and find 'local', you'll see where /etc/rc.d/rc/local runs, and that's
> what runs (sources inline) /etc/rc.local on startup (or in reverse order
> on shutdown, /etc/rc.shutdown.local)
> You only need source /etc/rc.conf if using rc.conf variables of course.
>  > c) /etc/rc hook
> Totally agree; don't go anywhere near there :)
>  > > I'm left clueless. As Linux refugee I have a feeling that this is
> doable
>  > > without a hack, like making init script, and having "sleep ..." in it
>  > > before payload. In Linux this is done using /etc/rc.d/rc.local which
> is
>  > > executed _after_ everything else is done.
>  >
>  > As you can see, an rc.d style mechanism will probably be the best
>  > solution here, except you are fully sure that the time when rc.local
>  > is run you will be provided with everything you need.
> We don't really know what Valeri wants to run, and whether it's one or
> more daemons, maybe including long-running background scripts, that may
> need start|stop|status control via service(8), or whether it's more
> simply one or more one-off tasks to be run sometime after startup?

It is rather simple thing which I need. I'm trying to set up openvpn, and
I need _after_ starting openvpn daemon to add tap0 interface to the bridge
then set IP on the bridge and on tap0 interface the same as that of real
interface which is member of this bridge. This is the only way I managed
to make openvpn really work (by trial and error). I'm kind of not inclined
to use openvpn's mechanism (which they seemingly have) to do it (it is not
a first time I spent this long setting up something on FreeBSD, but it was
the first time I spent this time... hm, not that productive. My ignorance
is to blame, still...)

Thanks again, everybody. I'm set on right tracks, and should be able to
successfully finish what I'm doing now.


> If the latter, there's nothing at all wrong with starting a script that
> runs in the background including sleep(1), so long as you don't have an
> inline sleep that would just pause the whole startup.  Something like ..
> /etc/rc.local:	(do not use exit or return, this runs within /etc/rc)
> wait=20
> ( sleep $wait	# sleep 5 should usually be more than enough
>   # perhaps wait for something or other to be running or exist?
>   # do stuff, maybe including starting further bg jobs, whatever ..
> ) &
> echo "my rc.local stuff starts in $wait seconds"
> cheers, Ian

Valeri Galtsev
Sr System Administrator
Department of Astronomy and Astrophysics
Kavli Institute for Cosmological Physics
University of Chicago
Phone: 773-702-4247

More information about the freebsd-questions mailing list