[Lxc-users] lxc-unshare woes and signal forwarding in lxc-start

Ferenc Wagner wferi at niif.hu
Thu May 6 15:21:28 UTC 2010


Daniel Lezcano <daniel.lezcano at free.fr> writes:

> Ferenc Wagner wrote:
>
>> Daniel Lezcano <daniel.lezcano at free.fr> writes:
>>   
>>> Ferenc Wagner wrote:
>>>     
>>>> I'd like to use lxc-start as a wrapper, invisible to the parent and
>>>> the (jailed) child.  Of course I could hack around this by not
>>>> exec-ing lxc-start but keeping the shell around, trap all signals and
>>>> lxc-killing them forward.  But it's kind of ugly in my opinion.
>>>       
>>> Ok, got it. I think that makes sense to forward the signals,
>>> especially for job management.  What signals do you want to forward?
>>
>> Basically all of them.  I couldn't find a definitive list of signals
>> used for job control in SGE, but the following is probably a good
>> approximation: SIGTTOU, SIGTTIN, SIGUSR1, SIGUSR2, SIGCONT, SIGWINCH and
>> SIGTSTP.  
>
> Yes, that could be a good starting point. I was wondering about
> SIGSTOP being sent to lxc-start which is not forwardable of course, is
> it a problem ?

I suppose not, SIGSTOP and SIGKILL are impossible to use in application-
specific ways.  On the other hand, SIGXCPU and SIGXFSZ should probably
be forwarded, too.  Naturally, this business can't be perfected, but a
"good enough" solution could still be valuable.

>> Looking at the source, the SIGCHLD mechanism could be
>> mimicked, but LXC_TTY_ADD_HANDLER may get in the way.
>
> We should remove LXC_TTY_ADD_HANDLER and do everything in the signal
> handler of SIGCHLD by extending the handler. I have a pending fix
> changing a bit the signal handler function.

Could you please send along your pending fix?  I'd like to experiment
with signal forwarding, but without stomping on that.

I noticed something strange:

# lxc-start -n jail -s lxc.mount.entry="/ /tmp/jail none bind 0 0" -s lxc.rootfs=/tmp/jail -s lxc.pivotdir=/mnt /bin/sleep 1000
(in another terminal)
# lxc-ps --lxc
CONTAINER    PID TTY          TIME CMD
jail        4173 pts/1    00:00:00 sleep
# kill 4173
(this does not kill the sleep!)
# strace -p 4173
Process 4173 attached - interrupt to quit
restart_syscall(<... resuming interrupted call ...> = ? ERESTART_RESTARTBLOCK (To be restarted)
--- SIGTERM (Terminated) @ 0 (0) ---
Process 4173 detached
# lxc-ps --lxc
CONTAINER    PID TTY          TIME CMD
jail        4173 pts/1    00:00:00 sleep
# fgrep -i sig /proc/4173/status 
SigQ:	1/16382
SigPnd:	0000000000000000
SigBlk:	0000000000000000
SigIgn:	0000000000000000
SigCgt:	0000000000000000
# kill -9 4173

That is, the jailed sleep process could be killed by SIGKILL only, even
though (according to strace) SIGTERM was delivered and it isn't handled
specially.  Why does this happen?

>> I'm also worried about signals sent to the whole process group: they
>> may be impossible to distinguish from the targeted signals and thus
>> can't propagate correctly.
>   
> Good point. Maybe we can setpgrp the first process of the container?

We've got three options:
  A) do nothing, as now
  B) forward to our child
  C) forward to our child's process group

The signal could arrive because it was sent to
  1) the PID of lxc-start
  2) the process group of lxc-start

If we don't put the first process of the container into a new process
group (as now), this is what happens:

        A                B                     C
1   swallowed            OK            others also killed
2      OK       child gets extra    everybody gets extra

If we put the first process of the container into a new process group:

        A                B                     C
1   swallowed            OK            others also killed
2   swallowed   only the child killed          OK

Neither is a clear winner, although the latter is somewhat more
symmetrical.  I'm not sure about wanting all this configurable...
-- 
Thanks,
Feri.




More information about the lxc-users mailing list