On 2015-02-17 Tue 14:24 PM |, Antoine Jacoutot wrote:
> On Tue, Feb 17, 2015 at 01:20:03PM +0000, Craig Skinner wrote:
> > Produces (on 5.6 release) - with start up order reversed:
> >
> > <root@box:~ 0># halt -p
> > stopping package daemons: greyscanner postfix sshguard.
> > stopping base daemons: cron spamlogd spamd sshd ntpd unbound nsd pflogd
> > syslogd.
> > syncing disks... done
>
> I cooked a patch for that a few months ago (actually >1 year ago iirc) but we
> decided not to go down that road for a reason I cannot recall right now.
> And I was using the information from /var/run/rc.d instead to know what to
> shutdown exactly instead of greping /etc/rc.
>
Changed to skip pflogd, syslogd & check /var/run/rc.d/
Index: rc
===================================================================
RCS file: /cvs/src/etc/rc,v
retrieving revision 1.447
diff -u -p -r1.447 rc
--- rc 22 Jan 2015 19:00:24 -0000 1.447
+++ rc 20 Feb 2015 16:38:49 -0000
@@ -131,17 +131,42 @@ fill_baddynamic()
}
}
-start_daemon()
+start_stop_daemon()
{
- local _n
- for _n; do
- eval _do=\${${_n}_flags}
- if [ X"${_do}" != X"NO" ]; then
- /etc/rc.d/${_n} start
- fi
+ local _start_stop=$1
+ local _daemon _daemon_script
+ shift
+
+ for _daemon
+ do
+ eval _do=\${${_daemon}_flags}
+ [[ ${_do} == 'NO' ]] && continue
+
+ _daemon_script="/etc/rc.d/${_daemon}"
+ [[ -e ${_daemon_script} ]] ||
+ {
+ print -n -- " ${_daemon}(absent)"
+ continue
+ }
+ [[ -x ${_daemon_script} ]] ||
+ {
+ print -n -- " ${_daemon}(inexecutable)"
+ continue
+ }
+ ${_daemon_script} ${_start_stop}
done
}
+start_daemon()
+{
+ start_stop_daemon 'start' $*
+}
+
+stop_daemon()
+{
+ start_stop_daemon 'stop' $*
+}
+
make_keys()
{
if [ ! -f /etc/isakmpd/private/local.key ]; then
@@ -269,12 +294,26 @@ if [ X"$1" = X"shutdown" ]; then
while [ -n "${pkg_scripts}" ]; do
_r=${pkg_scripts##* }
pkg_scripts=${pkg_scripts%%*( )${_r}}
- [ -x /etc/rc.d/${_r} ] && /etc/rc.d/${_r} stop
+ stop_daemon ${_r}
done
echo '.'
fi
[ -f /etc/rc.shutdown ] && sh /etc/rc.shutdown
+
+ print -n 'stopping base daemons:'
+ set -A _daemons $(egrep "start_daemon[[:blank:]][[:alnum:]]"
/etc/rc)
+ for _daemon in $(jot ${#_daemons[*]} ${#_daemons[*]} 1)
+ do
+ _daemon=${_daemons[${_daemon}]}
+ [[ ${_daemon} == 'start_daemon' ]] && continue
+ [[ -f /var/run/rc.d/${_daemon} ]] || continue
+ [[ ${_daemon} == 'pflogd' ]] && continue
+ [[ ${_daemon} == 'syslogd' ]] && continue
+ stop_daemon ${_daemon}
+ done
+ print '.'
+
else
echo single user: not running shutdown scripts
fi
@@ -513,11 +552,7 @@ rm -f /etc/rc.firsttime.run
if [ -n "${pkg_scripts}" ]; then
echo -n 'starting package daemons:'
for _r in $pkg_scripts; do
- if [ -x /etc/rc.d/${_r} ]; then
- start_daemon ${_r}
- else
- echo -n " ${_r}(absent)"
- fi
+ start_daemon ${_r}
done
echo '.'
fi