kill、killall、pkill

本文介绍了Linux系统中的kill、killall和pkill命令,详细讲解了这些命令如何发送不同信号到进程,如SIGTERM、SIGKILL、SIGUSR1等,并展示了它们在nginx服务管理、配置重载、日志操作和平滑升级中的应用。
摘要由CSDN通过智能技术生成

一、kill命令

kill命令用于向指定进程发送指定的信号。预设的信号是SIGTERM(15),可以将指定程序终止。如果无法终止该程序,可以使用SIGKILL(9)信息尝试强制删除程序。

kill命令的语法为:

kill [options] <pid> [...]
options表示可选参数,<pid>表示进程或作业识别号。可以指定多个<pid>,以空格分隔。
kill命令有以下选项:

-a:当处理当前进程时,不限制命令名和进程号的对应关系。
-l <信息编号>:若不加<信息编号>选项,则-l参数会列出全部的信息名称。
-p:指定kill命令只打印相关进程的进程号,而不发送任何信号。
-s <信息名称或编号>:指定要送出的信息。
-u <用户>:指定用户。

注意:kill命令是依靠PID来确定进程的,所以kill命令只能识别PID,而不能识别进程名。

kill命令常用信号及其含义

1) SIGHUP 重载配置
2) SIGINT 等同于Ctrl+C
3) SIGQUIT 处理完当前任务,优雅退出
9) SIGKILL 强制退出
10) SIGUSR1 重新生成日志文件
12) SIGUSR2 启动新的master进程,此时新老master进程并存
15) SIGTERM 正常结束,缺省信号,不填写即默认
18) SIGCONT 继续进程
19) SIGSTOP 停止进程
20) SIGTSTP 暂停进程,等同于Ctrl+Z
28) SIGWINCH 逐步关闭工作子进程,保留master

需要注意,各个信号的前缀SIG可以省略,也就是说SIGHUP等同于HUP,SIGTERM等同于TERM,两种写法都可以,kill命令都可以理解。

kill命令与nginx中的命令放在一起更容易理解

①停止nginx服务

nginx -s stop 
-s 参数是nginx程序向正在运行nginx服务发送信号,nginx程序会通过nginx.pid文件得到master进程的PID,再向运行中的master进程发送SIGTERM信号来关闭服务。

所以直接向nginx的master进程发送SIGTREM或SIGINT信号也是可以的
kill -s SIGTREM $(pidof nginx) 立即停止程序 -> 释放相应资源后终止程序
或
kill -s SIGINT $(pidof nginx)

②优雅停止服务
nginx服务正常处理完当前所有请求后再停止服务,终止程序,注意与SIGTREM的逻辑

nginx -s quit
或
kill -s SIGQUIT $(pidof nginx)

③重载配置项
使用于nginx配置文件修改后,需要重新加载配置项

nginx -s reload
或
kill -s SIGHUP $(pidof nginx)

④正确备份日志的步骤

步骤1:备份日志文件 mv access.log access.log-时间戳
步骤2:nginx -s reopen # 重新生成新的空的日志文件kill -s SIGUSR1 $(pidof nginx)
步骤3:删除超出保留时间的旧日志

⑤平滑升级Nginx

1 备份原nginx二进制文件,替换nginx文件
2 向master进程发送平滑迁移信号,执行这个命令后,新老master进程并存
kill -s SIGUSR2 `cat /usr/local/nginx/logs/nginx.pid`
此时nginx的pid文件会被备份重命名为nginx.pdi.oldbin
3 旧的worker子进程退出,不停止老的master进程是方便回滚
kill -s SIGWINCH `cat /usr/local/nginx/logs/nginx.pid.oldbin`
4 没有问题,结束老版本master进程,完成升级
kill -s SIGQUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
5 回滚情形,向老的master进程发送HUP,向新的master发送QUIT

二、killall命令

killall是一个用于发送信号给同名进程的命令。它可以根据进程名称来标识要发送信号的进程,可以用来杀死所有同名进程。

Usage: killall [-Z 上下文] [-u 用户名] [ -eIgiqrvw ] [ -信号 ] 程序名...
       killall -l, --list
       killall -V, --version
       
-e --exact:要求完全匹配非常长的名称。
-I --ignore-case:忽略大小写进行进程名称匹配。
-g --process-group:杀死进程组而不是进程。
-y --younger-than:杀死比指定时间年轻的进程。
-o --older-than:杀死比指定时间年长的进程。
-i --interactive:在杀死进程前询问确认。
-l --list:列出所有已知的信号名称。
-q --quiet:不打印投诉信息。
-r --regexp:将NAME解释为扩展正则表达式。
-s --signal SIGNAL:发送这个信号代替SIGTERM。
-u --user USER:只杀死以USER身份运行的进程。
-v --verbose:报告信号是否成功发送。
-V --version:显示版本信息。
-w --wait:等待进程死亡。
-Z,--context 正则表达式 仅杀死含有指定上下文的进程
                          (必须在其他参数前使用)

例如,killall -9 nginx会向所有名为nginx的进程发送SIGKILL信号,而killall -s SIGUSR2 nginx则会向所有名为nginx的进程发送SIGUSR2信号。

三、pkill命令

pkill命令用于发送信号给匹配特定模式的进程。它是ps命令和kill命令的结合,可以根据进程名来杀死指定进程。

以下是pkill命令的详细解释:

语法:pkill(选项)(参数)
选项:
-c ctidlist:仅匹配列表中列出的ID的进程。
-d delim:指定每一个匹配的进程ID之间分割字符串。如果没有-d选项指定,默认的是新行字符。
-g pgrplist:仅匹配进程组ID在给定列表中的进程。如果组0包括在列表中,这个被解释为pgrep或者pkill进程的组ID。每一个组ID可以使用组名称或者数字的组ID指定。
-l选项:仅在pgrep命令中有效。
参数:pkill命令的参数是用于匹配进程的模式,可以是进程名称、PID等。

例如,pkill -SIGTERM nginx会向所有名为nginx的进程发送SIGTERM信号。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值