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 start <container-name>
nixos-container stop <container-name>
nixos-container kill <container-name> [--signal <signal-specifier>]
nixos-container status <container-name>
nixos-container update <container-name> [--config <string>]
nixos-container login <container-name>
@ -37,13 +38,15 @@ my $systemPath;
my $ensureUniqueName = 0;
my $autoStart = 0;
my $extraConfig;
my $signal;
GetOptions(
"help" => sub { showHelp() },
"ensure-unique-name" => \$ensureUniqueName,
"auto-start" => \$autoStart,
"system-path=s" => \$systemPath,
"config=s" => \$extraConfig
"config=s" => \$extraConfig,
"signal=s" => \$signal
) or exit 1;
my $action = $ARGV[0] or die "$0: no action specified\n";
@ -186,6 +189,14 @@ sub isContainerRunning {
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 {
system("systemctl", "stop", "container\@$containerName") == 0
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"
unless POSIX::access($confFile, &POSIX::W_OK);
stopContainer if isContainerRunning;
$signal = "SIGKILL";
killContainer if (isContainerRunning);
safeRemoveTree($profileDir) if -e $profileDir;
safeRemoveTree($gcRootsDir) if -e $gcRootsDir;
@ -245,6 +257,10 @@ elsif ($action eq "stop") {
stopContainer;
}
elsif ($action eq "kill") {
killContainer;
}
elsif ($action eq "status") {
print isContainerRunning() ? "up" : "down", "\n";
}