my $target = $ENV{LXC_TARGET};
if ($target && $target eq 'reboot') {
- # in order to make sure hot-plugged config changes aren't reverted
+ # In order to make sure hot-plugged config changes aren't reverted
# to what the monitor initially loaded we need to stop the container
- # and restart it
- local $SIG{HUP} = 'IGNORE';
- my $pid = fork();
- die "fork failed during container reboot: $!\n" if !defined($pid);
- if (!$pid) {
- POSIX::setsid();
- close STDIN;
- close STDOUT;
- close STDERR;
- PVE::LXC::update_lxc_config($vmid, $conf);
- exec {'lxc-start'} 'lxc-start', '-n', $vmid
- or POSIX::_exit(-1);
- }
+ # and restart it.
+ # Update the config and queue a restart of the pve-container@$vmid
+ # task, note that we must not block because we're part of the
+ # service cgroup systemd waits for to die before issuing the new
+ # lxc-start command.
+ PVE::LXC::update_lxc_config($vmid, $conf);
+ # Tell the post-stop hook we want to be restarted.
+ open(my $fh, '>', "/var/lib/lxc/$vmid/reboot")
+ or die "failed to create reboot trigger file: $!\n";
+ close($fh);
# cause lxc to stop instead of rebooting
- POSIX::_exit(1);
+ exit(1);
}
return undef;