- 本系列文章,将整理一系列Linux环境下进程相关的操作命令,包括进程启动、kill、挂起、查看、前后台进程切换等各种命令。
- 本文为本系列的第一篇,进程的查看,主要关注如何查看进程的相关信息。
ps
- process status,命令用于显示当前进程的状态,类似于 windows 的任务管理器。
- 进程的相关信息,包括PID、内存、CPU、命令行、用户态/内核态、进程的虚拟大小、内存中页的数量、执行状态信息等;
- ps的显示的结果是执行ps命令的那个时刻的那些进程;
- 例子1:显示所有进程:
[qxhgd@localhost ~]$ ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.2 0.2 125588 4168 ? Ss 03:41 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22 root 2 0.0 0.0 0 0 ? S 03:41 0:00 [kthreadd] root 4 0.0 0.0 0 0 ? S 03:41 0:00 [kworker/0:0H] root 6 0.0 0.0 0 0 ? S 03:41 0:00 [ksoftirqd/0] root 7 0.0 0.0 0 0 ? S 03:41 0:00 [migration/0] root 8 0.0 0.0 0 0 ? S 03:41 0:00 [rcu_bh] root 9 0.0 0.0 0 0 ? R 03:41 0:00 [rcu_sched] root 10 0.0 0.0 0 0 ? S 03:41 0:00 [lru-add-drain] root 11 0.0 0.0 0 0 ? S 03:41 0:00 [watchdog/0]
- 例子2:显示qxhgd用户发起的进程:
[qxhgd@localhost ~]$ ps -u qxhgd PID TTY TIME CMD 2366 ? 00:00:00 sshd 2371 pts/0 00:00:00 bash 2401 ? 00:00:00 sshd 2406 ? 00:00:00 sftp-server 2590 pts/0 00:00:00 ps
- 例子3、查找涉及sshd的进程
[qxhgd@localhost ~]$ ps -ef | grep sshd root 1323 1 0 03:41 ? 00:00:00 /usr/sbin/sshd -D root 2362 1323 0 03:50 ? 00:00:00 sshd: qxhgd [priv] root 2364 1323 0 03:50 ? 00:00:00 sshd: qxhgd [priv] qxhgd 2366 2362 0 03:50 ? 00:00:00 sshd: qxhgd@pts/0 qxhgd 2401 2364 0 03:50 ? 00:00:00 sshd: qxhgd@notty qxhgd 2645 2371 0 04:06 pts/0 00:00:00 grep --color=auto sshd
pstree
- display a tree of processes,命令将所有进程以树状图显示,树状图将会以 pid (如果有指定) 或是以 init 这个基本进程为根 (root),如果有指定使用者 id,则树状图会只显示该使用者所拥有的进程。
- 一个例子:
[qxhgd@localhost] pstree systemd─┬─NetworkManager───2*[{NetworkManager}] ├─abrt-watch-log ├─abrtd ├─agetty ├─atd ├─auditd─┬─audispd─┬─sedispatch │ │ └─{audispd} │ └─{auditd} ...
pstack
- pstack 是一个shell脚本,用于打印正在运行的进程的栈跟踪信息,它实际上是 gstack 的一个链接,而gstack本身是基于gdb封装的shell脚本。
- 一个例子,显示pid未2371的sshd的堆栈信息:
[qxhgd@localhost ~]$ ps -u qxhgd PID TTY TIME CMD 2366 ? 00:00:00 sshd 2371 pts/0 00:00:00 bash 2401 ? 00:00:00 sshd 2406 ? 00:00:00 sftp-server 2590 pts/0 00:00:00 ps [qxhgd@localhost ~]$ pstack 2371 #0 0x00007f6fc200245c in waitpid () from /lib64/libc.so.6 #1 0x0000000000440b84 in waitchld.isra.10 () #2 0x0000000000441e3c in wait_for () #3 0x0000000000433b0e in execute_command_internal () #4 0x0000000000433d2e in execute_command () #5 0x000000000041e365 in reader_loop () #6 0x000000000041c9ce in main ()
pgrep
- pgrep能查找当前正在运行的进程并列出符合条件的进程ID。
- 例如显示sshd的PID:
[qxhgd@localhost ~]$ pgrep sshd 1323 2362 2364 2366 2401
top
- top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器;
- 和ps类似,但是不同的是,top显示的是实时的数据(默认3秒,刷新数据),人工不干预,则shell不会退出top命令;而ps显示的是执行ps当时的进程数据,执行完ps,shell上就结束ps命令了;
- 几个常用的操作命令参数:
top //每隔5秒显式所有进程的资源占用情况 top -d 2 //每隔2秒显式所有进程的资源占用情况 top -c //每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名) top -p 12345 -p 6789//每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况 top -d 2 -c -p 123456 //每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数
- 一个例子:
[qxhgd@localhost ~]$ top top - 04:12:48 up 31 min, 1 user, load average: 0.00, 0.01, 0.05 Tasks: 238 total, 2 running, 236 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1863076 total, 992972 free, 526040 used, 344064 buff/cache KiB Swap: 2097148 total, 2097148 free, 0 used. 1176936 avail Mem USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND qxhgd 20 0 162152 2408 1584 R 0.3 0.1 0:00.42 top root 20 0 125588 4180 2620 S 0.0 0.2 0:01.94 systemd root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H root 20 0 0 0 0 S 0.0 0.0 0:00.16 ksoftirqd/0 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh root 20 0 0 0 0 R 0.0 0.0 0:00.58 rcu_sched root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain root rt 0 0 0 0 S 0.0 0.0 0:00.02 watchdog/0 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
top的变种
htop
- Linux系统中的一个互动的进程查看器,与Linux传统的top比较的话,htop更人性化,可认为是top的升级版本;
- 可以在垂直和水平方向上滚动,所以你可以看到系统上运行的所有进程,以及他们完整的命令行;
- 可以不用输入进程的 PID 就可以对此进程进行相关的操作 (killing, renicing);
- 安装方式:
#安装epel源 yum install epel-release #安装htop yum install -y htop #安装完毕后命令行输入 htop
一个执行的例子:
atop
- atop是一个功能非常强大的linux服务器监控工具,它的数据采集主要包括:CPU、内存、磁盘、网络、进程等,并且内容非常的详细,特别是当那一部分存在压力它会以特殊的颜色进行展示,如果颜色是红色那么说明已经非常严重了;
- 所有的信息都是反映过去10s的状态信息;
- 一个执行atop的例子:
[qxhgd@localhost ~]$ atop ATOP - localhost 2022/01/24 04:26:47 ----------------- 10s elapsed PRC | sys 0.06s | user 0.05s | #proc 238 | #trun 2 | #tslpi 375 | #tslpu 0 | #zombie 0 | clones 2 | no procacct | CPU | sys 1% | user 0% | irq 0% | idle 99% | wait 0% | steal 0% | guest 0% | | curf 2.30GHz | CPL | avg1 0.11 | avg5 0.14 | avg15 0.10 | | csw 529 | | intr 435 | |numcpu 1 | MEM | tot 1.8G | free 669.8M | cache 572.2M | dirty 2.2M | buff 2.1M | slab 94.8M | shmem 10.4M | shrss 0.0M | numnode 1 | SWP | tot 2.0G | free 2.0G | swcac 0.0M | | | | | vmcom 2.0G | vmlim 2.9G | NET | transport | tcpi 8 | tcpo 8 | udpi 0 | udpo 0 | tcpao 0 | tcppo 0 | tcprs 4 | udpie 0 | NET | network | ipi 8 | ipo 11 | ipfrw 0 | deliv 8 | | | icmpi 0 | icmpo 0 | NET | eth0 0% | pcki 8 | pcko 12 | sp 1000 Mbps | si 0 Kbps | so 3 Kbps | erri 0 | erro 0 | drpo 0 | PID SYSCPU USRCPU RDELAY VGROW RGROW RUID EUID ST EXC THR S CPUNR CPU CMD 1/1 3021 0.04s 0.04s 0.00s 104.5M 2.9M qxhgd qxhgd -- - 1 R 0 1% atop 1420 0.00s 0.01s 0.00s 0B 0B root root -- - 1 S 0 0% smbd 2366 0.01s 0.00s 0.00s 0B 0B qxhgd qxhgd -- - 1 S 0 0% sshd 2942 0.01s 0.00s 0.02s 0B 0B root root -- - 1 S 0 0% kworker/0:2 1329 0.00s 0.00s 0.00s 0B 0B root root -- - 1 S 0 0% nmbd 854 0.00s 0.00s 0.00s 0B 0B root root -- - 2 S 0 0% vmtoolsd 882 0.00s 0.00s 0.00s 0B 0B root root -- - 1 S 0 0% abrt-watch-log 1738 0.00s 0.00s 0.00s 0B 0B postfix postfix -- - 1 S 0 0% qmgr 1737 0.00s 0.00s 0.00s 0B 0B postfix postfix -- - 1 S 0 0% pickup 861 0.00s 0.00s 0.00s 0B 0B root root -- - 1 S 0 0% rngd 1482 0.00s 0.00s 0.00s 0B 0B root root -- - 1 S 0 0% smbd-notifyd 1484 0.00s 0.00s 0.00s 0B 0B root root -- - 1 S 0 0% cleanupd 1728 0.00s 0.00s 0.00s 0B 0B root root -- - 1 S 0 0% master 872 0.00s 0.00s 0.00s 0B 0B rtkit rtkit -- - 3 S 0 0% rtkit-daemon 6 0.00s 0.00s 0.03s 0B 0B root root -- - 1 S 0 0% ksoftirqd/0 9 0.00s 0.00s 0.07s 0B 0B root root -- - 1 R 0 0% rcu_sched 525 0.00s 0.00s 0.00s 0B 0B root root -- - 1 S 0 0% kworker/0:1H
btop
- btop,一个美观的系统资源监视器,显示处理器、内存、磁盘、网络和进程的使用情况和统计信息。btop是更轻、更快的C++ 版本,是bashtop和bpytop的延续。
ytop
- ytop is a nice program if you want to see nice graphs showing CPU, memory and network utilization in a console. It does have a process list but it is not very powerful or useful as a process manager even though there are some keyboard shortcuts for basic process management available.
gtop
- gtop 是一款用 JavaScript 编写的开源系统资源监控实用程序,它是 Linux 系统自带 top 工具的替代品。虽然 gtop 工具的曝光率和流行程度远不如 htop,但它还是非常值得系统管理员一试。
vtop
- Command-line tools like “top” make it difficult to see CPU usage across multi-process applications (like Apache and Chrome), spikes over time, and memory usage. That’s why we created vtop.
- Vtop is a free and open source activity monitor for the command line. It is written in node.js and can be easily extended.
Gotop
- Gotop 是一个 TUI 图形活动监视器,使用 Go 语言编写。它是完全免费、开源的,受到了 gtop 和 vtop 的启发。
Ptop
- 使用 Python 编写的 ptop。它同样是一个自由开源的、在 MIT 许可下发布的系统活动监视器。
- ptop 同时兼容 Python2.x 和 Python3.x,因此可以使用 Python 的软件包管理器 pip 轻松安装。
Hegemon
- Hegemon 是一个正在开发中的模块化系统监视器,以安全的 Rust 编写。
- 它允许用户在单个仪表板中监控两种使用情况。分别是系统利用率和硬件温度。
GUI环境
- ubuntu系统的gnome-system-monitor,类似于windows的进程管理器;
lsof
- 功能为列举系统中已经被打开的文件(设备、目录、sockets等),如果没有指定任何选项或参数,lsof则列出所有活动进程打开的所有文件。
- 两个例子:
lsof -i:22 #查看打开22端口的进程 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1582 root 3u IPv4 11989 0t0 TCP *:ssh (LISTEN) sshd 1582 root 4u IPv6 11991 0t0 TCP *:ssh (LISTEN) sshd 2829 root 3r IPv4 19635 0t0 TCP bogon:ssh->bogon:15264 (ESTABLISHED) [qxhgd@localhost ~]$ lsof -p 1 #查看pid为1的进程(init)打开的文件,其输出结果等同于上面的命令,他们都是init COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd unknown /proc/1/cwd (readlink: Permission denied) systemd 1 root rtd unknown /proc/1/root (readlink: Permission denied) systemd 1 root txt unknown /proc/1/exe (readlink: Permission denied) systemd 1 root NOFD /proc/1/fd (opendir: Permission denied)
jobs
- 作业控制命令,可以用来查看当前终端放入后台的工作;
- 该命令在本系列的后续文章中还会涉及;
pidof
- pidof 是Linux系统中用来查找正在运行进程的进程号(pid)的工具,功能类似pgrep和ps;
- 例子:
[qxhgd@localhost ~]$ pidof sshd 2401 2366 2364 2362 1323 [qxhgd@localhost ~]$ pidof -s sshd 2401 [qxhgd@localhost ~]$
w
- 用于显示目前登入系统的用户信息,目前登入系统的用户有哪些人,以及他们正在执行的程序 ,也即:
w - Show who is logged on and what they are doing.
- 一个例子:
[qxhgd@localhost ~]$ w 04:31:38 up 50 min, 1 user, load average: 0.01, 0.06, 0.07 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT qxhgd pts/0 192.168.2.2 03:50 2.00s 0.13s 0.00s w
/proc/pid
- 每个进程,都有一个以其pid号为目录名的文件夹,其中涉及的proc文件的常用参数如下:
/proc/pid/cmdline #进程启动命令 /proc/pid/cwd #链接到进程当前工作目录 /proc/pid/environ #进程环境变量列表 /proc/pid/exe #链接到进程的执行命令文件 /proc/pid/fd #包含进程相关的所有的文件描述符 /proc/pid/maps #与进程相关的内存映射信息 /proc/pid/mem #指代进程持有的内存,不可读 /proc/pid/root #链接到进程的根目录 /proc/pid/stat #进程的状态 /proc/pid/statm #进程使用的内存的状态 /proc/pid/status #进程状态信息,比stat/statm更具可读性 /proc/self #链接到当前正在运行的进程
- 值得一提的是,proc/pid目录下文件内容,是前面其他命令获得信息的主要来源;
- 以我环境上pid 1下的文件为例:
[qxhgd@localhost 1]$ sudo ls attr clear_refs cpuset fd limits mem net oom_score personality schedstat stack syscall wchan autogroup cmdline cwd fdinfo loginuid mountinfo ns oom_score_adj projid_map sessionid stat task auxv comm environ gid_map map_files mounts numa_maps pagemap root setgroups statm timers cgroup coredump_filter exe io maps mountstats oom_adj patch_state sched smaps status uid_map
pidstat
- pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况;
- pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。
- 常用命令参数示例:
pidstat #查看所有进程的 CPU 使用情况 pidstat -u -p ALL #等价于pidstat pidstat -u #等价于pidstat pidstat -r #进程的内存情况统计 pidstat -d #进程的IO情况 pidstat -w -p 8888 #进程的上下文切换情况