From 60c6c7bc9a0d564cf86af4b1711b33db48cf0d07 Mon Sep 17 00:00:00 2001 From: "Scott R. Parish" Date: Wed, 20 Jul 2016 11:43:34 -0700 Subject: [PATCH] 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. --- .../nixos-container/nixos-container.pl | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/pkgs/tools/virtualization/nixos-container/nixos-container.pl b/pkgs/tools/virtualization/nixos-container/nixos-container.pl index eda57a9751e..a4b6f11654e 100755 --- a/pkgs/tools/virtualization/nixos-container/nixos-container.pl +++ b/pkgs/tools/virtualization/nixos-container/nixos-container.pl @@ -22,6 +22,7 @@ Usage: nixos-container list nixos-container destroy nixos-container start nixos-container stop + nixos-container kill [--signal ] nixos-container status nixos-container update [--config ] nixos-container login @@ -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"; }