Date: Sun, 31 Jan 2016 01:19:09 +1100 (EST) From: Ian Smith <smithi@nimnet.asn.au> To: Polytropon <freebsd@edvax.de> Cc: Valeri Galtsev <galtsev@kicp.uchicago.edu>, freebsd-questions@freebsd.org Subject: Re: "epilogue" script? Message-ID: <20160131000408.N51785@sola.nimnet.asn.au> In-Reply-To: <mailman.107.1454155202.96392.freebsd-questions@freebsd.org> References: <mailman.107.1454155202.96392.freebsd-questions@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
In freebsd-questions Digest, Vol 608, Issue 6, Message: 20 On Sat, 30 Jan 2016 11:59:55 +0100 Polytropon <freebsd@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: > 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? 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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20160131000408.N51785>