Linux kill
约 1121 字大约 4 分钟
2025-01-11
介绍
kill
命令用于终止正在运行的进程。
kill
命令可以发送不同的信号给目标进程,来实现不同的操作,如果不指定信号,默认会发送 TERM 信号(15)
,即终止。若仍无法终止该程序,可使用 SIGKILL(9)
信息尝试强制删除程序。
语法
$ kill [options] <PID>
其中 <PID>
是要终止进程的进程 ID
。
options
说明:
-l
:列出所有可用的信号。-<signal>
:发送特定的信号给目标进程,如-9
表示发送KILL
信号,即强制终止进程。
常用信号:
SIGKILL(信号9)
:立即结束进程,不能被捕获或忽略。SIGTERM(信号15)
:正常结束进程,可以被捕获或忽略。SIGSTOP(信号19)
:暂停进程,不能被捕获、忽略或结束。SIGCONT(信号18)
:继续执行被暂停的进程。SIGINT(信号2)
:通常是Ctrl+C
产生的信号,可以被进程捕获或忽略。
使用
获取进程的PID
获取进程的PID
有多种方式,例如使用 ps
命令或 top
命令等。更多方法可以查看Linux 查询进程的PID
默认终止进程
默认情况下,kill命令发送SIGTERM(信号15),这可以请求进程终止。如果进程没有捕获这个信号,它将被终止。
$ kill PID
其中 PID
是进程的 ID
。
发送指定信号
通过 -s
选项可以发送指定的信号。
$ kill -s SIGNAL PID
例如,发送 SIGKILL(信号9)
将立即结束进程,不能被忽略或捕获。
$ kill -9 PID
杀死进程组
使用 -9
选项可以杀死整个进程组。
$ kill -9 -PID
本地根据服务名称kill
# ZHIPUAI_SERVER_DIR="/data/apps/py/test-agents/main.py"
$ ps -ef | grep $ZHIPUAI_SERVER_DIR | grep -v grep | awk '{print $2}' | xargs kill
$ ps -ef | grep wl_apscheduler.py | grep -v grep | awk '{print $2}' | xargs kill -9
$ sudo kill - $(pidof 进程名关键字)
根据端口号kill
kill -9 $(lsof -i:8000 | awk '{print $2}')
远程根据服务名称kill
- 远程服务进程
# ZHIPUAI_SERVER_DIR="/data/apps/py/test-agents/main.py"
$ ssh username@host "ps -ef | grep $ZHIPUAI_SERVER_DIR | grep -v grep | awk '{print $2}'"
ps -ef
指令用来查询所有进程grep
通过管道来过滤grep -v
是反向查询的意思,grep -v grep
的作用是除去包含grep
的项。awk '{print $2}'
以空格作为分隔符,打印第二个字段远程查询
PID
并只显示进程号
# ZHIPUAI_SERVER_DIR="/data/apps/py/test-agents/main.py"
pid=$(ssh username@host "ps -ef | grep $ZHIPUAI_SERVER_DIR | grep -v grep | awk '{print $2}'"| awk '{print $2}')
echo $pid
- 只
kill
掉一个进程
$ ssh username@host "kill -9 ${pid}"
错误
远程kill
进程报错:kill: failed to parse argument: 'root'
$ ps -ef | grep wl_apscheduler.py | grep -v grep | awk '{print $2}' | xargs kill -9
由于$2
是个变量,无法读取到远端主机的变量,因此执行杀掉进程命令时,找不到,导致报错。修改为\$2
。
$ ps -ef | grep wl_apscheduler.py | grep -v grep | awk '{print \$2}' | xargs kill -9
屏蔽bash
的line 23: 73654 Killed
输出
$ ps -ef | grep wl_apscheduler.py | grep -v grep | awk '{print $2}' | xargs kill -9
-bash: line 23: 73654 Killed nohup python3 ./wl_apscheduler.py > output.log 2>&1
[1]+ Exit 137 cd /var/mt-project/mt-scrapy/welfare-lottery-scrapy/ && nohup python3 ./wl_apscheduler.py > output.log 2>&1
bash
如何屏蔽kill
输出,我不希望脚本显示输出如上的: line 23: 73654 Killed
。
我运行如下脚本:
sleep 20 &
PID=$!
kill -9 $PID >/dev/null 2>&1
我不希望脚本显示如下输出:
line 51: 22943 Killed sleep
我不知道为什么会这样,我将输出重定向到/dev/null
。对我有用的唯一方法是在这里stackoverflow.com/a/14152313/6706875,kill -13 pid
,它不会生成任何默认的kill
输出。该消息不是来自kill
或后台命令,而是来自bash
,它发现其后台作业之一已被杀死。为了避免出现此消息,请使用disown
将其从bash
的作业控件中删除:
sleep 20 &
PID=$!
disown $PID
kill -9 $PID
总结
kill
、killall
、pkill
比较
特性 | kill | killall | pkill |
---|---|---|---|
操作方式 | 需要明确指定 PID | 需要指定进程名 | 通过进程名或其他属性匹配 |
匹配方式 | 精确的 PID | 进程名 | 进程名或其他属性 |
支持正则匹配 | 不支持 | 不支持 | 支持复杂匹配(如 -f) |
操作范围 | 仅针对特定进程 | 匹配全部同名进程 | 可灵活控制匹配的进程范围 |