ps
~$ ps
PID TTY TIME CMD
4775 pts/1 00:00:00 bash
16083 pts/1 00:00:00 ps
在这个输出中,列出了两个进程的信息,每个进程的信息由PID(进程ID)、TTY(终端类型)、TIME(CPU时间)和CMD(命令名)四个字段组成。
PID: 进程ID,是系统分配给每个进程的唯一标识符。在这个例子中,有两个进程,进程ID分别是4775和16083。
TTY: 终端类型,表示进程是在哪个终端上运行的。pts/1 表示这是一个伪终端(pseudo-terminal slave),通常用于图形界面下的终端模拟器或者SSH会话。这里的两个进程都在pts/1上运行,意味着它们共享同一个终端窗口。
TIME: CPU时间,表示进程占用的CPU时间。这里显示的是00:00:00,意味着这两个进程到目前为止还没有占用明显的CPU时间,或者它们刚刚开始运行。
CMD: 命令名,表示启动进程的命令。在这个例子中,PID为4775的进程是由bash命令启动的,这是一个常用的命令行界面程序。PID为16083的进程是由ps命令启动的,ps命令用于显示当前系统中的进程状态。
总结来说,这个输出显示了两个进程的信息:一个是bash进程,它可能是一个命令行会话;另一个是ps进程,它是因为用户执行了ps命令来查看当前进程列表而被创建的。由于ps命令的执行非常短暂,所以它的CPU时间显示为00:00:00。
1) ps -ef
-e选项 代表显示系统内的所有进程信息。
-f选项 用于产生完整的格式输出。这个组合可以列出非常详细的进程信息,包括进程的 UID(用户 ID)、PID(进程 ID)、PPID(父进程 ID)、C(进程使用的 CPU 时间百分比)、STIME(进程启动时间)、TTY(进程相关的终端设备)、TIME(进程使用的 CPU 时间总和)以及 CMD(启动进程的命令名称)等。
~$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Aug21 ? 00:00:12 /sbin/init auto noprompt
root 2 0 0 Aug21 ? 00:00:00 [kthreadd]
root 3 2 0 Aug21 ? 00:00:00 [rcu_gp]
root 4 2 0 Aug21 ? 00:00:00 [rcu_par_gp]
root 5 2 0 Aug21 ? 00:00:00 [slub_flushwq]
root 6 2 0 Aug21 ? 00:00:00 [netns]
root 8 2 0 Aug21 ? 00:00:00 [kworker/0:0H-events_highpri]
root 10 2 0 Aug21 ? 00:00:00 [mm_percpu_wq]
root 11 2 0 Aug21 ? 00:00:00 [rcu_tasks_rude_]
root 12 2 0 Aug21 ? 00:00:00 [rcu_tasks_trace]
root 13 2 0 Aug21 ? 00:00:00 [ksoftirqd/0]
root 14 2 0 Aug21 ? 00:00:16 [rcu_sched]
root 15 2 0 Aug21 ? 00:00:01 [migration/0]
root 16 2 0 Aug21 ? 00:00:00 [idle_inject/0]
root 18 2 0 Aug21 ? 00:00:00 [cpuhp/0]
root 19 2 0 Aug21 ? 00:00:00 [cpuhp/1]
root 20 2 0 Aug21 ? 00:00:00 [idle_inject/1]
root 21 2 0 Aug21 ? 00:00:01 [migration/1]
root 22 2 0 Aug21 ? 00:00:00 [ksoftirqd/1]
2) ps aux
a选项 表示显示所有与终端相关或无关的进程。
u选项 用于显示进程的详细用户信息。
x选项 显示没有控制终端的进程。此命令会显示更详细的信息,包括 USER(进程所有者的用户名)、PID、%CPU(进程占用的 CPU 百分比)、%MEM(进程占用的内存百分比)、VSZ(进程使用的虚拟内存大小,单位为 KB)、RSS(进程使用的物理内存大小,单位为 KB)、STAT(进程的状态,如 R 表示运行中,S 表示睡眠,D 表示不可中断的睡眠等)、START(进程的启动时间)、TIME(进程累计使用的 CPU 时间)、COMMAND(启动进程的命令)等。
~$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 169544 12768 ? Ss Aug21 0:12 /sbin/init auto noprompt
root 2 0.0 0.0 0 0 ? S Aug21 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< Aug21 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< Aug21 0:00 [rcu_par_gp]
root 5 0.0 0.0 0 0 ? I< Aug21 0:00 [slub_flushwq]
root 6 0.0 0.0 0 0 ? I< Aug21 0:00 [netns]
root 8 0.0 0.0 0 0 ? I< Aug21 0:00 [kworker/0:0H-events_highp
root 10 0.0 0.0 0 0 ? I< Aug21 0:00 [mm_percpu_wq]
root 11 0.0 0.0 0 0 ? S Aug21 0:00 [rcu_tasks_rude_]
root 12 0.0 0.0 0 0 ? S Aug21 0:00 [rcu_tasks_trace]
root 13 0.0 0.0 0 0 ? S Aug21 0:00 [ksoftirqd/0]
root 14 0.0 0.0 0 0 ? I Aug21 0:16 [rcu_sched]
root 15 0.0 0.0 0 0 ? S Aug21 0:01 [migration/0]
root 16 0.0 0.0 0 0 ? S Aug21 0:00 [idle_inject/0]
root 18 0.0 0.0 0 0 ? S Aug21 0:00 [cpuhp/0]
root 19 0.0 0.0 0 0 ? S Aug21 0:00 [cpuhp/1]
用途
1. 监控系统进程:管理员可以通过ps命令随时了解系统中正在运行的进程情况,以便及时发现异常进程,如占用过多 CPU 或内存的进程。例如,如果发现某个未知进程占用了大量 CPU 资源,可以进一步调查该进程的来源和用途,判断是否是恶意程序或存在程序错误。
2. .查找特定进程:当需要查找某个特定程序的进程 ID 以便进行操作(如终止进程)时,可以使用ps命令。比如,要查找名为firefox的浏览器进程,可以使用ps aux | grep firefox
,它会列出所有包含firefox关键字的进程信息,然后可以根据 PID 进行进一步操作。
举例查找名为bash的浏览器进程
~$ ps aux | grep bash
zzq 3928 0.0 0.0 10616 4832 pts/0 Ss+ Aug21 0:00 bash
zzq 4775 0.0 0.0 10636 5040 pts/1 Ss Aug21 0:00 -bash
zzq 16098 0.0 0.0 9040 720 pts/1 S+ 08:20 0:00 grep --color=auto bash
3. 分析系统性能:通过观察进程的 CPU 和内存使用情况,可以分析系统性能瓶颈。如果多个进程都出现高 CPU 使用率,可能意味着系统负载过高,需要考虑升级硬件或优化程序。如果某些进程的内存使用不断增长且不释放,可能存在内存泄漏问题,需要对相关程序进行检查和修复。
kill
kill 命令用于终止正在运行的进程。在Linux和Unix系统中,每个进程都有一个唯一的进程ID(PID),kill 命令通过指定进程ID来向指定进程发送信号,以达到终止进程的目的。
kill [options] PID
PID:要终止的进程的进程ID。
options:可选参数,用于指定发送的信号类型或控制行为。
1) -9 或 --kill
发送强制终止信号(SIGKILL),立即终止目标进程。这是一种强制的终止方式,但可能会导致未保存数据丢失。
kill -9 PID
2) -15 或 --terminate
-15 或 --terminate
:发送终止信号(SIGTERM),请求目标进程优雅地退出。通常情况下,进程可以捕获这个信号并执行清理操作后自行退出。默认啥都不加就等于是15。
kill -15 PID # = kill PID
3) kill -l
-l
:列出所有可用的信号名称。
kill -l
~$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
信号类型
SIGTERM(15):默认发送的终止信号,通常用于请求进程正常退出。
SIGKILL(9):强制终止信号,立即终止进程,无法被阻塞或忽略。
终止进程ID为 1234 的进程:
kill 1234 #或者kill -15 1234
强制终止进程ID为 5678 的进程:
kill -9 5678
使用场景
1. 结束僵尸进程: 僵尸进程是已经终止但其父进程未能正确处理终止状态的进程。可以使用 kill 命令将僵尸父进程终止并清理掉。
2. 关闭异常进程: 当某个进程消耗过多资源或者表现异常时,可以使用 kill 命令终止它,以恢复系统的正常运行。
3. 进程管理: 在系统管理和运维中,kill 命令是管理进程生命周期的重要工具,能够有效地管理和控制进程的行为。
父进程/子进程
~$ ps -ef |grep zzq
zzq 1865 1 0 Aug21 ? 00:00:01 /lib/systemd/systemd --user
zzq 1866 1865 0 Aug21 ? 00:00:00 (sd-pam)
zzq 1871 1865 0 Aug21 ? 00:00:08 /usr/bin/pulseaudio --daemonize=no --log-target=journal
zzq 1873 1865 0 Aug21 ? 00:00:00 /usr/libexec/tracker-miner-fs
zzq 1876 1865 0 Aug21 ? 00:00:02 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
1.1865进程编号是zzq的master进程或者说主进程,它的父进程是1号进程,这个1号进程理解就是操作系统(普通的业务进程的父进程都应该是1号进程)。
2.1866和1871等进程编号是zzq的work进程,它的父进程就是zzq的master进程,反之他们就是1865的子进程。
总结
1.ps 命令讲到的2个常用参数实际上是两种操作习惯或者风格,99%的的问题使用他们是没有区别的。
2.无论是哪个用法,他们都会显示所有的进程,我们基本上都需要通过我们前面在Linux-搜索命令(二)的grep来进行过滤,过滤的选项可以是进程名字,也可用启动命令等。
3.kill命令主要作用是杀死进程,其实还有个选项,-2 这个需要应用程序支持这个信号才可以支持,它才可以最优雅关闭进程。
4.kill虽然可以一次杀死多个进程(kill pid1 pid2 pid3 …),但是其实还有一个pkill的命令可以杀死一类进程,可以提高效率。
5.其实还有部分进程是无法通过kill -9 杀死的,在Linux里面叫不可中断睡眠进程
参考
笔记记录与实际操作。原文请看https://mp.weixin.qq.com/s/DeIizNLmI6WznucViM6UPw