/etc/rc, /dev/console, and the C shell

utzoo!decvax!ucbvax!menlo70!sri-unix!ucla-vax!wales at Berkeley utzoo!decvax!ucbvax!menlo70!sri-unix!ucla-vax!wales at Berkeley
Mon Jan 4 19:45:03 AEST 1982


RE:  Consequences of changing "init" to make /etc/rc a C-shell file
     and give it /dev/console as its stdin/stdout/stderr

I while ago I asked for comments about the above suggestions.  I went
ahead and implemented them about a week ago.  It seems to work fine.

The first immediate benefits of doing this were that I was able to take
advantage of the C shell's nicer (in my opinion, at least) control
syntax, and I didn't need to write ">/dev/console" at the end of
practically every line.

Further, I was able to make the following nice additions to /etc/rc:

(1) We are running 4.1BSD and thus have the automatic reboot facility
    with "fsck -p".  If /etc/rc is invoked without an auto-reboot being
    indicated, I query the operator as follows (remember that "init"
    passes the argument "autoboot" to the /etc/rc shell when an auto-
    reboot is desired):

	if ($#argv == 0) then
	    echo -n ^G^G^G^GCheck file systems? ''
	    set XX = $<
	    if ($XX == yes || $XX == y || $XX == "") then
		set argv = autoboot
	    else
		echo -n ^G^G^G^GNO?? '' Are you sure?? ''
		set XX = $<
		if ($XX == yes || $XX == y || $XX == "") then
		    goto nochecks
		else
		    exit 1
		endif
	    endif
	endif

    where "nochecks" in the above is a label placed just after the
    part that invokes "fsck -p" and examines the exit status.  This
    makes it possible to go single-user, then check the disks and
    come up automatically, without having to reboot.  (How many times
    do you REALLY want to go multi-user from the single-user shell
    without running checks?  Sometimes, I agree, but not often.)

(2) I can now interrupt /etc/rc at anytime before it exits, and return
    to single-user mode, by having "onintr interrupt" near the beginning
    and the following at the end (just after the "exit 0"):

	interrupt:
	    echo ''
	    echo -n reboot interrupted: ''
	    date
	    exit 1

    Previously, if I tried to interrupt /etc/rc after "fsck" was done
    (or if "fsck" wasn't done), I succeeded only in aborting individual
    commands; /etc/rc as a whole would just keep rolling along, and the
    only way to stop the juggernaut was to do a control-P and halt the
    CPU.  (Reason:  /etc/rc had no controlling TTY, but daemons and
    such with ">/dev/console" did.)

Several people warned of problems relating to the assignment of process
groups.  I haven't had any difficulties here.  "update", "cron", and the
other daemons spun off by /etc/rc end up in a process group equal to the
PID of the shell which executed /etc/rc.  This PID is NOT the same as
that of any login shell subsequently created on /dev/console, and
"newproc" (sys/slp.c) never reuses a PID that is an active process group
ID, so my daemons can't be affected by anyone doing interrupts, quits,
or "kill 0" from any process or any terminal (even the console).

As for a daemon's not being able to establish its own process group,
4.1BSD does have a "setpgrp" system call, so a daemon could set its
process group ID equal to its process ID if it really cared to.

As for the idea that "there may not be a /dev/console, but there'll
always be a /" -- a little thought should make it clear that you're in
REAL deep yogurt unless you have /dev/console, because every line in
/etc/rc that redirects output to the console will bomb out (including
the "fsck -p", so auto-reboot fails), and the single-user shell spun
off by "init" is going to be a great help without a console to talk
to!!  Since I've GOTTA have a /dev/console on my system to do anything
at all, then, I lose nothing by having /etc/rc talk to it by default.

-- Rich



More information about the Comp.unix.wizards mailing list