On Sat, Dec 28, 2013 at 6:23 PM, Craig R. Skinner <skin...@britvault.co.uk>wrote:
> On 2013-12-28 Sat 21:16 PM |, Craig R. Skinner wrote: > > On 2013-12-19 Thu 13:43 PM |, Craig R. Skinner wrote: > > > Enhance rc.d/rc.subr with lowered/raised daemon running priority. > > > > > > > Take 2: > > > > Replace /etc/rc.d/<daemon> rc_renice=X with > > /etc/rc.conf.local <daemon>_nice=X > > > > Take 3 - simplify: > > Use nice directly between ${rcexec} & ${daemon} with rc_start(), > rather than renice post start. > Change rc_reprioritise() to rc_validate_rcnice() > > Backgrounding still works as expected. > > This now works with privilege separated binaries, such as ntpd: > > $ fgrep ntp /etc/rc.conf.local > ntpd_flags="-s" > ntpd_nice=YES > > $ ps -l -U _ntp > UID PID PPID CPU PRI NI VSZ RSS WCHAN STAT TT TIME > COMMAND > 83 4226 1 0 2 10 708 1136 poll SNs ?? 0:00.09 > ntpd: ntp engine (ntpd) > 83 22421 4226 3 2 10 644 1020 poll INs ?? 0:00.01 > ntpd: dns engine (ntpd) > > > > Index: rc.subr > =================================================================== > RCS file: /cvs/src/etc/rc.d/rc.subr,v > retrieving revision 1.70 > diff -u -u -p -r1.70 rc.subr > --- rc.subr 11 Jul 2013 09:34:33 -0000 1.70 > +++ rc.subr 28 Dec 2013 23:10:14 -0000 > @@ -1,4 +1,4 @@ > -# $OpenBSD: rc.subr,v 1.70 2013/07/11 09:34:33 otto Exp $ > +# $OpenBSD: rc.subr,v 1.15 2013/12/28 22:57:21 skinner Exp $ > # > # Copyright (c) 2010, 2011 Antoine Jacoutot <ajacou...@openbsd.org> > # Copyright (c) 2010, 2011 Ingo Schwarze <schwa...@openbsd.org> > @@ -54,7 +54,8 @@ rc_rm_runfile() { > } > > rc_start() { > - ${rcexec} "${daemon} ${daemon_flags} ${_bg}" > + [[ -n ${_rcnice} ]] && _nice="$(which nice) -n ${_rcnice}" > + ${rcexec} "${_nice} ${daemon} ${daemon_flags} ${_bg}" > } > > rc_check() { > @@ -104,6 +105,46 @@ rc_wait() { > return 1 > } > > +rc_validate_rcnice() > +{ > + [[ -x $(which nice) ]] || > + { > + # /usr not mounted? > + unset _rcnice > + return > + } > + > + [[ ${_rcnice} == 'YES' ]] && > + { > + # nice(1): an increment of 10 is assumed. > + _rcnice=10 > + return > + } > + > + # if digits present > + printf "%d" ${_rcnice} > /dev/null 2>&1 && > + { > + # strip non-digits for comparison > + _rcnice=$(printf "%d" ${_rcnice}) > + [[ ${_rcnice} -eq 0 ]] && > + { > + unset _rcnice > + return > + } > + } > + > case "${_rcnice}" in +([[:digit:]])) ;; YES ;; *) print meeeh ;; > > + # nice(1): The priority can be adjusted over a > + # range of -20 (the highest) to 20 (the lowest). > + for _nice_level in $(jot 40 20 -20) > + do > + [[ ${_rcnice} == ${_nice_level} ]] && return > + done > + > + # Shouldn't get this far: > + print -u2 "$0: ignoring invalid ${_name}_nice level: ${_rcnice}" > + unset _rcnice > +} > + > If i understood a bit better the (great) local philosophy checking if the digit in arg is good is doing a work that nice will do , so all of this is useless, all you want in something like $var match yes or (-)1/2 digit. And it he first digit is 0, 1 or 2 you already reduce to -29 to 29 > rc_cmd() { > local _bg _n > > @@ -136,6 +177,9 @@ rc_cmd() { > fi > [ -z "${INRC}" ] && rc_do rc_check && exit 0 > echo $_n "${INRC:+ }${_name}" > + > + [[ -n ${_rcnice} ]] && rc_validate_rcnice > + > while true; do # no real loop, only needed to break > if type rc_pre >/dev/null; then > rc_do rc_pre || break > @@ -203,6 +247,7 @@ _RC_RUNFILE=${_RC_RUNDIR}/${_name} > > eval _rcflags=\${${_name}_flags} > eval _rcuser=\${${_name}_user} > +eval _rcnice=\${${_name}_nice} > > getcap -f /etc/login.conf ${_name} 1>/dev/null 2>&1 && \ > daemon_class=${_name} > @@ -213,6 +258,7 @@ getcap -f /etc/login.conf ${_name} 1>/de > [ -n "${_RC_FORCE}" ] && [ X"${_rcflags}" = X"NO" ] && unset _rcflags > [ -n "${_rcflags}" ] && daemon_flags=${_rcflags} > [ -n "${_rcuser}" ] && daemon_user=${_rcuser} > +[[ ${_rcnice} == 'NO' ]] && unset _rcnice > > # sanitize > daemon_flags=$(printf ' %s' ${daemon_flags}) > > > Cheers, > -- > Craig Skinner | http://www.bbc.co.uk/programmes/b03mtrg9/clips > > -- --------------------------------------------------------------------------------------------------------------------- () ascii ribbon campaign - against html e-mail /\