nixos-container: add 'kill' command, 'destroy' to use 'kill'

Using 'machinectl kill' is much faster then gracefully stopping the
container.

In the case of 'destroy', since we're destroying it anyway, there's no
reason to do a graceful shutdown.
This commit is contained in:
Scott R. Parish 2016-07-20 11:43:34 -07:00
parent 659a3bc89b
commit 60c6c7bc9a

View File

@ -22,6 +22,7 @@ Usage: nixos-container list
nixos-container destroy <container-name> nixos-container destroy <container-name>
nixos-container start <container-name> nixos-container start <container-name>
nixos-container stop <container-name> nixos-container stop <container-name>
nixos-container kill <container-name> [--signal <signal-specifier>]
nixos-container status <container-name> nixos-container status <container-name>
nixos-container update <container-name> [--config <string>] nixos-container update <container-name> [--config <string>]
nixos-container login <container-name> nixos-container login <container-name>
@ -37,13 +38,15 @@ my $systemPath;
my $ensureUniqueName = 0; my $ensureUniqueName = 0;
my $autoStart = 0; my $autoStart = 0;
my $extraConfig; my $extraConfig;
my $signal;
GetOptions( GetOptions(
"help" => sub { showHelp() }, "help" => sub { showHelp() },
"ensure-unique-name" => \$ensureUniqueName, "ensure-unique-name" => \$ensureUniqueName,
"auto-start" => \$autoStart, "auto-start" => \$autoStart,
"system-path=s" => \$systemPath, "system-path=s" => \$systemPath,
"config=s" => \$extraConfig "config=s" => \$extraConfig,
"signal=s" => \$signal
) or exit 1; ) or exit 1;
my $action = $ARGV[0] or die "$0: no action specified\n"; my $action = $ARGV[0] or die "$0: no action specified\n";
@ -186,6 +189,14 @@ sub isContainerRunning {
return $status =~ /ActiveState=active/; return $status =~ /ActiveState=active/;
} }
sub killContainer {
my @args = ();
push(@args, ("--signal", $signal)) if ($signal ne "");
system("machinectl", "kill", $containerName, @args) == 0
or die "$0: failed to kill container\n";
}
sub stopContainer { sub stopContainer {
system("systemctl", "stop", "container\@$containerName") == 0 system("systemctl", "stop", "container\@$containerName") == 0
or die "$0: failed to stop container\n"; or die "$0: failed to stop container\n";
@ -228,7 +239,8 @@ if ($action eq "destroy") {
die "$0: cannot destroy declarative container (remove it from your configuration.nix instead)\n" die "$0: cannot destroy declarative container (remove it from your configuration.nix instead)\n"
unless POSIX::access($confFile, &POSIX::W_OK); unless POSIX::access($confFile, &POSIX::W_OK);
stopContainer if isContainerRunning; $signal = "SIGKILL";
killContainer if (isContainerRunning);
safeRemoveTree($profileDir) if -e $profileDir; safeRemoveTree($profileDir) if -e $profileDir;
safeRemoveTree($gcRootsDir) if -e $gcRootsDir; safeRemoveTree($gcRootsDir) if -e $gcRootsDir;
@ -245,6 +257,10 @@ elsif ($action eq "stop") {
stopContainer; stopContainer;
} }
elsif ($action eq "kill") {
killContainer;
}
elsif ($action eq "status") { elsif ($action eq "status") {
print isContainerRunning() ? "up" : "down", "\n"; print isContainerRunning() ? "up" : "down", "\n";
} }