通过命令行方式启动了一个alpine镜像,命名为alpine1
ctr c create -d docker.io/library/alpine:latest alpine1
ctr run -d --net-host docker.io/library/alpine:latest alpine1
但是发现在kill的时候失效,一直处于RUNNING状态
ctr tasks kill alpine1
通过-h可以看到,默认signal为SIGTERM
[root@containerd ~]# ctr tasks kill alpine1 -h
NAME:
ctr tasks kill - signal a container (default: SIGTERM)
USAGE:
ctr tasks kill [command options] [flags] CONTAINER
OPTIONS:
--signal value, -s value signal to send to the container
--exec-id value process ID to kill
--all, -a send signal to all processes inside the container
这里我初步怀疑是信号种类的问题导致没有结束该task,所以使用kill -l命令查看信号种类,其中我们常用的可能就是SIGTERM信号与SIGKILL信号
SIGTERM信号与SIGKILL信号
kill 发送SIGTERM信号到指定进程,如果进程没有捕获该信号,则进程终止。SIGTERM是程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。
SIGKILL:kill -9 会发送这个信号,用来强制使进程立即结束。
SIGKILL是不能被捕获的,程序收到这个信号后,一定会退出。这就是kill -9一定能保证将程序杀死的原因。
解决方法
所以猜测通过发送SIGKILL信号即可强制停止该task,于是尝试了一下该方法,task成功停止。
ctr tasks kill alpine1 --signal SIGKILL
[root@containerd ~]# ctr t ls
TASK PID STATUS
alpine1 22252 STOPPED