引言
登录某业务海外服务器,查看到一个检查日志的脚本执行了非常多。
原因初步推测是脚本中的 rsync 推送数据到国内卡住了。
现在需要批量关闭这些进程。
ps 命令查看进程状态
首先使用ps -ef
或ps aux
,再加 grep 过滤出需要关闭的进程,其实也可以使用 pgrep(我比较少用,刚才才在 man 里面发现 )。
ps 命令经常使用,但其命令选项具体含义还没有认真查看 man 来学习理解下,这次就看看 man 里面的说明。
ps -ef 选项带“-”,是使用的标准语法 This version of ps accepts several kinds of options: 1 UNIX options, which may be grouped and must be preceded by a dash. 2 BSD options, which may be grouped and must not be used with a dash. 3 GNU long options, which are preceded by two dashes. -e Select all processes. Identical to -A. -f Do full-format listing. This option can be combined with many other UNIX-style options to add additional columns. It also causes the command arguments to be printed. When used with -L, the NLWP (number of threads) and LWP (thread ID) columns will be added. See the c option, the format keyword args, and the format keyword comm. -L Show threads, possibly with LWP and NLWP columns. -L 是显示线程和线程数,之前有写一篇文章写过通过`/proc/${PID}/task`判断一个程序是否是多线程程序,这里更直接一些。 `ps aux`没有以“-”开头,是 BSD 风格的选项。 然后是进程状态码 PROCESS STATE CODES。 我们经常看到的大部分进程状态在 Ss, S interruptible sleep (waiting for an event to complete) s is a session leader S (task_interruptible): 可中断的睡眠状态 处于这个状态的进程因为等待某某事件的发生(比如等待 socket 连接、等待信号量),而被挂起。 这些进程的 task_struct 结构被放入对应事件的等待队列中。 当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。 通过 ps 命令我们会看到,一般情况下,进程列表中的绝大多数进程都处于 task_interruptible 状态(除非机器的负载很高)。 毕竟 CPU 就这么一两个,进程动辄几十上百个,如果不是绝大多数进程都在睡眠,CPU 又怎么响应得过来。 会话主要是针对一个终端建立的。session leader 是一个会话的领导进程。
使用 pkill 批量关闭进程
pkill 主要是基于名字来发送信号给相关进程的。
Ref
man ps pkill pgrep
Linux 进程状态 说明
ps 进程查看器
Linux 进程关系
Linux ps 进程状态码