github.com/containers/libpod@v1.9.4-0.20220419124438-4284fd425507/cmd/podman/kill.go (about)

     1  package main
     2  
     3  import (
     4  	"github.com/containers/libpod/cmd/podman/cliconfig"
     5  	"github.com/containers/libpod/pkg/adapter"
     6  	"github.com/containers/libpod/pkg/util"
     7  	"github.com/opentracing/opentracing-go"
     8  	"github.com/pkg/errors"
     9  	"github.com/spf13/cobra"
    10  )
    11  
    12  var (
    13  	killCommand cliconfig.KillValues
    14  
    15  	killDescription = "The main process inside each container specified will be sent SIGKILL, or any signal specified with option --signal."
    16  	_killCommand    = &cobra.Command{
    17  		Use:   "kill [flags] CONTAINER [CONTAINER...]",
    18  		Short: "Kill one or more running containers with a specific signal",
    19  		Long:  killDescription,
    20  		RunE: func(cmd *cobra.Command, args []string) error {
    21  			killCommand.InputArgs = args
    22  			killCommand.GlobalFlags = MainGlobalOpts
    23  			killCommand.Remote = remoteclient
    24  			return killCmd(&killCommand)
    25  		},
    26  		Args: func(cmd *cobra.Command, args []string) error {
    27  			return checkAllLatestAndCIDFile(cmd, args, false, false)
    28  		},
    29  		Example: `podman kill mywebserver
    30    podman kill 860a4b23
    31    podman kill --signal TERM ctrID`,
    32  	}
    33  )
    34  
    35  func init() {
    36  	killCommand.Command = _killCommand
    37  	killCommand.SetHelpTemplate(HelpTemplate())
    38  	killCommand.SetUsageTemplate(UsageTemplate())
    39  	flags := killCommand.Flags()
    40  
    41  	flags.BoolVarP(&killCommand.All, "all", "a", false, "Signal all running containers")
    42  	flags.StringVarP(&killCommand.Signal, "signal", "s", "KILL", "Signal to send to the container")
    43  	flags.BoolVarP(&killCommand.Latest, "latest", "l", false, "Act on the latest container podman is aware of")
    44  
    45  	markFlagHiddenForRemoteClient("latest", flags)
    46  }
    47  
    48  // killCmd kills one or more containers with a signal
    49  func killCmd(c *cliconfig.KillValues) error {
    50  	if c.Bool("trace") {
    51  		span, _ := opentracing.StartSpanFromContext(Ctx, "killCmd")
    52  		defer span.Finish()
    53  	}
    54  
    55  	// Check if the signalString provided by the user is valid
    56  	// Invalid signals will return err
    57  	killSignal, err := util.ParseSignal(c.Signal)
    58  	if err != nil {
    59  		return err
    60  	}
    61  
    62  	runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
    63  	if err != nil {
    64  		return errors.Wrapf(err, "could not get runtime")
    65  	}
    66  	defer runtime.DeferredShutdown(false)
    67  
    68  	ok, failures, err := runtime.KillContainers(getContext(), c, killSignal)
    69  	if err != nil {
    70  		return err
    71  	}
    72  	return printCmdResults(ok, failures)
    73  }