[Lxc-users] How to make a container init DIE after finishing runlevel 0

Michael H. Warfield mhw at WittsEnd.com
Tue Jan 26 00:13:36 UTC 2010


On Tue, 2010-01-26 at 00:42 +0100, Daniel Lezcano wrote: 
> Michael H. Warfield wrote:
> > On Mon, 2010-01-25 at 21:50 +0100, Daniel Lezcano wrote:
> >
> >   
> >>> apologies for the length, but how is everyone else handling this?
> >>> this is the last thing i need to solve before i actually start running
> >>> all my services on this setup.
> >>>   
> >>>       
> >> I was wondering if the kernel shouldn't send a signal to the init's 
> >> parent when sys_reboot is called.
> >>     
> >
> > Which still leaves open the question of telling the difference between a
> > halt and a reboot.  My trick of using the final runlevel
> > in /var/run/utmp ran a foul over a gotcha in the Debian containers that
> > they seem to default to mounting tmpfs over /var/run and /var/lock so
> > you loose that information.  I had to disable "RAMRUN" and "RAMLOCK"
> > in /etc/default/rcS in the debian images to get around that but I'm not
> > sure I'm happy doing that.  The alternative examining /var/log/wtmp
> > didn't work out as reliable.  OpenVZ has a similar problem and it writes
> > a "reboot" file that can be read but that seems inelegant as well.  I
> > don't think anything works if someone does a "reboot -f" but I need to
> > test that condition yet.
> >
> > To also answer the OP's question.  Here's what I use.  I have a script
> > that runs periodically in the host.  If the number of processes in a
> > running container is 1, then I check for the runlevel in
> > ${rootfs}/var/run/utmp.  If that's "? 0" then it's a halt and I run
> > lxc-stop.  If it's "? 6" then it's a reboot and I stop the container and
> > then restart it.  I run it every 5 minutes or so or manually.  It runs
> > fast and could be run more often.  Just sucks polling things like that,
> > though.  That script, lxc-check, is attached.
> >   

> I trick I just found:

> while $(true); do
>     inotifywait /var/lib/lxc/debian/rootfs/var/run/utmp;
>     if [ "$(wc -l /cgroup/debian/tasks | awk '{ print $1 }')" = "1" ]; then
>         lxc-stop -n debian
>     fi;
> done

Oh I LIKE THAT!

Just a couple of comments...

1) Still have the problem with the Debian default of mounting tmpfs
on /var/run.

2) Probably still need some sort of deadman's switch in case things die
and didn't update utmp.

3) That "if" check is overly complicated.  You don't really need the
awk.  (nit => pick)

4) Still need to separate halt and reboot.  If utmp is valid for
detecting changes then utmp is valid for doing a runlevel query and we
can tee off from that.

But I like it.  I can incorporate that into my start-up wrapper in a
heartbeat.

> This command can stay always there and it will trigger a lxc-stop when 
> the container remains with 1 process.
> No polling and immediate :)
> At the first glance, it seems to work well, but of course not compatible 
> with upstart.

Why isn't it compatible with upstart?  I thought utmp was being
maintained properly even with upstart.  I know upstart doesn't have the
same concept of runlevels and maintains them purely for "compatibility"
but I thought the whole utmp/wtmp was part of that.  Wouldn't this also
work equally well with .../var/log/wtmp instead (other than the fact
that you're going to wake up on every damn wtmp record)?  I'll have to
test.

Mike
-- 
Michael H. Warfield (AI4NB) | (770) 985-6132 |  mhw at WittsEnd.com
   /\/\|=mhw=|\/\/          | (678) 463-0932 |  http://www.wittsend.com/mhw/
   NIC whois: MHW9          | An optimist believes we live in the best of all
 PGP Key: 0x674627FF        | possible worlds.  A pessimist is sure of it!
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 482 bytes
Desc: This is a digitally signed message part
URL: <http://lists.linuxcontainers.org/pipermail/lxc-users/attachments/20100125/48b80527/attachment.pgp>


More information about the lxc-users mailing list