本文列举了查看系统信息、查看发行版信息、进程管理等方面的一些常用命令

一、查看系统信息

1. uname

uname,英文全称为“unix name”,用于输出一组系统信息。

语法:uname [选项]

有关选项

  -a, --all                以如下次序输出所有信息。其中若 -p 和 -i 的探测结果不可知则被省略:
  -s, --kernel-name        输出内核名称(默认)
  -n, --nodename           输出网络节点上的主机名
  -r, --kernel-release     输出内核发行号
  -v, --kernel-version     输出内核版本
  -m, --machine            输出主机的硬件架构名称
  -p, --processor          输出处理器类型(不可移植)
  -i, --hardware-platform  输出硬件平台或(不可移植)
  -o, --operating-system   输出操作系统名称
  --help                       显示此帮助信息并退出
  --version                     显示版本信息并退出

实例:

$ uname -a
Linux hollowman 6.1.0-28-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.119-1 (2024-11-22) x86_64 GNU/Linux

2. cat /proc/version

/proc/version文件中存储着系统版本有关信息。

$ cat /proc/version 
Linux version 6.1.0-28-amd64 (debian-kernel@lists.debian.org) (gcc-12 (Debian 12.2.0-14) 12.2.0, GNU ld (GNU Binutils for Debian) 2.40) #1 SMP PREEMPT_DYNAMIC Debian 6.1.119-1 (2024-11-22)

二、查看发行版信息

3. lsb_release -a

有些发行版提供命令查看当前系统版本的详细信息,如Debian、ubuntu等发行版可通过lsb_release -a来查看

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 12 (bookworm)
Release:        12
Codename:       bookworm

4. cat /etc/redhat-release

redhat,centos的当前系统版本详细信息存储在/etc/redhat-release文件中

cat /etc/redhat-release 

5. cat /etc/os-release

ubuntu、debian以及华为的openEuler的当前系统版本详细信息存储在 /etc/os-release文件中

$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

三、查看用户信息

6. whoami

whoami,who am i? 显示与当前的有效用户ID 相关联的用户名。

$ whoami
hy

7. who

显示当前已登录的用户信息。

$ who
hy       tty7         2024-12-12 17:40 (:0)
hy       pts/0        2024-12-12 17:40 (:0)
hy       pts/4        2024-12-12 17:53 (:0)

8. w

比who更详细,能显示用户登录名、终端标志、星期几登录和具体登录时间、闲置时间、用户正在执行的程序、占用CPU时间、系统的运行时间和平均负载等。

$ w
 23:00:43 up  5:32,  3 users,  load average: 0.21, 0.22, 0.21
USER     TTY      来自           LOGIN@   IDLE   JCPU   PCPU WHAT
hy       tty7     :0               17:40    5:32m  2:23   0.08s /usr/bin/startplasma-x11
hy       pts/0    :0               17:40    5:20m  0.00s  6.45s /usr/bin/kded5
hy       pts/4    :0               17:53    3.00s  0.09s  0.01s w

四、进程管理

1. ps process,查看瞬间进程状态(查看实时进程用top命令)

$ ps
  PID TTY          TIME CMD
40964 pts/3    00:00:00 bash
40970 pts/3    00:00:00 ps

默认情况下,ps 命令只显示与当前用户和当前控制端相关联的进程。 它显示进程 ID(PID),与进程相关联的终端(tname = TTY),进程占用 CPU 时长([DD-] hh:mm:ss格式)和产生进程的命令(CMD)。

linux系统中的ps命令支持3种不同类型的命令行参数:

1) Unix风格,选项以-开头。
2) BSD风格,选项不能以-开头。
3) GNU长选项,选项以--开头。

3种格式的命令可以混用,但可能会出现冲突。灵活使用各选项可以显示自己想要的输出。

常用选项梳理

# Unix风格选项
 -A, -e                显示所有进程
 -a                    显示所有TTY值存在的进程,除去bash和TTY终端等进程
 -u                    显示有效的用户,当后面跟<UID>时含义同-U。
 -d                    显示所有进程,除去bash和TTY终端等进程
 -f                    完整输出,包含命令行参数(在默认字段基础上,显示UID,PPID,C,STIME字段)
 -F                    更为完整的输出 (在 -f 显示字段基础上,增加SZ,RSS,PSR字段)

# BSD风格选项
  a                    显示所有TTY值存在的进程,包括其他用户
  u                    面向用户的格式,其输出会包含用户名字段

# 含义相同的选项
 -x, x                 显示没有控制终端的进程,默认一般不显示没有控制终端的进程
 -t, t/T, --tty <tty>  显示与指定终端关联的进程
 -p, p, --pid <PID>    显示指定进程编号的进程
 -r, r                 显示运行进程
 -w, w                 不限制输出宽度,默认不显示超出设备宽度以外的输出。
 -U, U, --user <UID>   显示指定用户的进程

# 含义相近的选项
 -l, l                 显示长格式/BSD长格式
 -j, j                 显示工作格式/BSD工作格式

显示字段

字段名含义
UID用户名
PID进程 ID
PPID父进程 ID
CCPU 使用的资源占比
STIME进程开始执行时间
TTY与进程相关联的终端(进程在哪个终端运行)
TIME进程占用 CPU 时长([DD-] hh:mm:ss格式)
CMD产生进程的命令
SZ
RSS进程所占用的内存量
PSR

进程状态:

状态名含义
- R(运行):进程正在运行或在运行队列中等待。
- S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该 状态。
- D(不可中断):进程不响应系统异步信号,即便用kill命令也不能将其中断。
- Z(僵死):进程已经终止,但进程描述符依然存在, 直到父进程调用wait4()系统函数后将进程释放。
- T(停止):进程收到停止信号后停止运行
- N:低优先级
- <:高优先级
- L:被锁进内存
- s:包含子进程
- l:多线程

ps 命令选项实在太多,以下是一些常用组合:

1. 打印所有进程信息

$ ps -ef
$ ps aux           # ps aux 和 ps –e u 输出效果相同 

2. 打印进程树

$ ps -ejH
$ ps axjf

3. 打印线程信息

$ ps -eLf
$ ps axms

2. top 动态显示进程

top命令前5行动态显示系统运行总体参数:

  • 第1行:系统时间、运行时间、登录终端数、系统负载(3个数值分别为1分钟、5分钟、15分钟内的平均值,数值越小意味着负载越低)。
  • 第2行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。
  • 第3行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源百分比、...。
  • 第4行:物理内存总量、内存空闲量、内存使用量、作为内核缓存的内存量。
  • 第5行:虚拟内存总量、虚拟内存空闲量、虚拟内存使用量、已被提前加载的内存量。
$ top
top - 23:11:18 up  5:42,  3 users,  load average: 0.30, 0.33, 0.25
任务: 261 total,   1 running, 260 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.9 us,  1.1 sy,  0.0 ni, 97.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st 
MiB Mem :  15934.1 total,   5570.8 free,   6348.7 used,   4520.4 buff/cache     
MiB Swap:  30518.0 total,  30518.0 free,      0.0 used.   9585.4 avail Mem 

 进程号 USER      PR  NI    VIRT    RES    SHR    %CPU  %MEM     TIME+ COMMAND                                                                                              
    648 root     -51   0       0      0      0 S   2.7   0.0   4:06.37 irq/42-nvidia                                                                                        
  47206 hy        20   0 1693276 252964 156564 S   2.3   1.6   3:49.48 kwin_x11                                                                                             
    810 root      20   0   24.4g 221768  69208 S   1.7   1.4   2:45.29 Xorg                                                                                                 
  47276 hy        20   0 2559956 546492 236588 S   1.0   3.3   2:03.31 plasmashell                                                                                          
  50430 hy        20   0 1131.2g 177480 107136 S   1.0   1.1   1:55.02 WeChatAppEx                                                                                          
  53114 hy        20   0 1173912 151260 115664 S   1.0   0.9   0:05.39 konsole              
.......

关于 top 的几个使用技巧:

1.排序

默认是以占用 cpu 大小进行排序的,按 N 键则以进程号排序,按 M 键则以占用内存大小排序,按 P 键回到以占用 cpu 大小排序

2.指定显示

按u键,输入某个用户名,可以选择只动态显示指定用户的进程
按n键,输入数量,可以控制每次只显示n条记录
按k键,输入进程id及信号(如9),可以发送进程信号(9表示杀死进程)

3. pstree process tree,显示进程树。

几个常用选项

  -s, --show-parents  显示所选进程的父进程
  -t, --thread-names  显示完整的线程名称,默认不显示线程名称(只显示线程数量)
  -c, --compact-not   不对完全相同的子树进行压缩
  -p, --show-pids     显示 PID;隐含启用 -c 选项
  -a, --arguments     显示命令行参数
  -V, --version       显示版本信息

实例:

$ pstree    #显示进程树,默认从pid为1的进程开始,也就是systemd进程
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager───2*[{NetworkManager}]
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─apache2───5*[apache2]
        ├─avahi-daemon───avahi-daemon
        ├─cron
        ├─cups-browsed───2*[{cups-browsed}]
        ├─cupsd
        ├─dbus-daemon
        ├─fcitx5───2*[{fcitx5}]
        ... 省略...

$ pstree -p   # -p 参数显示进程的 PID
systemd(1)─┬─ModemManager(767)─┬─{ModemManager}(772)
           │                   └─{ModemManager}(778)
           ├─NetworkManager(751)─┬─{NetworkManager}(770)
           │                     └─{NetworkManager}(771)
           ├─accounts-daemon(629)─┬─{accounts-daemon}(662)
           │                      └─{accounts-daemon}(672)
           ├─apache2(811)─┬─apache2(813)
           │              ├─apache2(814)
           │              ├─apache2(815)
           │              ├─apache2(816)
           │              └─apache2(818)
           ├─avahi-daemon(632)───avahi-daemon(642)
           ├─cron(633)
           ├─cups-browsed(911)─┬─{cups-browsed}(972)
           │                   └─{cups-browsed}(973)
           ├─cupsd(776)
           ├─dbus-daemon(634)
           ├─fcitx5(47149)─┬─{fcitx5}(47150)
           │               └─{fcitx5}(47299)
             ... 省略...


$ pstree 811    # 显示pid 为811 的进程树,默认会将相同名字的子树压缩,前面用数量加上星号(*) 链接,也就是乘的意思
apache2───5*[apache2]

$ pstree 811 -c  # 可以用 -c 参数取消这个压缩
apache2─┬─apache2
        ├─apache2
        ├─apache2
        ├─apache2
        └─apache2

$ pstree 811 -p  #我们用 -p 参数显示进程 PID后,因名字多了个进程PID,也就是说名字不同了,这时也会取消压缩
apache2(811)─┬─apache2(813)
             ├─apache2(814)
             ├─apache2(815)
             ├─apache2(816)
             └─apache2(818)

$ pstree 811 -s    # -s 参数可以显示父进程
systemd───apache2───5*[apache2]

$ pstree 811 -a  # -a 参数可以显示命令行参数
apache2 -k start
  ├─apache2 -k start
  ├─apache2 -k start
  ├─apache2 -k start
  ├─apache2 -k start
  └─apache2 -k start

$ pstree www-data -p    # 显示 www-data 用户(apache2 服务用户)的进程树
apache2(813)
apache2(814)
apache2(815)
apache2(816)
apache2(818)

$ pstree 640 -p -t  #显示 PID 为640进程树,并显示线程名称(如果有的话)
udisksd(640)─┬─{cleanup}(713)
             ├─{gdbus}(671)
             ├─{gmain}(660)
             └─{probing-thread}(687)

$ pstree 640 -p    # 看这个显示就没有显示线程名称,用 {} 包裹的表示这是一个线程,不是线程则不会用 {} 包裹
udisksd(640)─┬─{udisksd}(660)
             ├─{udisksd}(671)
             ├─{udisksd}(687)
             └─{udisksd}(713)

4.pidof

查询某个指定服务的全部进程的pid值,一个服务对应1至多个进程,但每个进程都只有唯一pid值。

命令语法:pidof [选项] [服务名]

$ pidof apache2    # 还是用 apache2 做测试,对比上面的实例,看是否一致
818 816 815 814 813 811

5. kill 终止对应pid值的服务进程

命令语法:

kill [-s 信号声明 | -n 信号编号 | -信号声明] 进程ID
kill -l [信号声明 | 信号编号]

使用 kill 命令前,先说说信号声明、信号编号的对应关系:

$ kill -l   # 打印所有信号名称,这里数字表示信号编号,SIGHUP是信号名称,而SIGHUP中的HUP则表示信号声明
 1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL     5) SIGTRAP
 2) SIGABRT     7) SIGBUS     8) SIGFPE     9) SIGKILL    10) SIGUSR1
1)  SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM
2)  SIGSTKFLT    17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP
3)  SIGTTIN    22) SIGTTOU    23) SIGURG    24) SIGXCPU    25) SIGXFSZ
4)  SIGVTALRM    27) SIGPROF    28) SIGWINCH    29) SIGIO    30) SIGPWR
5)  SIGSYS    34) SIGRTMIN    35) SIGRTMIN+1    36) SIGRTMIN+2    37) SIGRTMIN+3
6)  SIGRTMIN+4    39) SIGRTMIN+5    40) SIGRTMIN+6    41) SIGRTMIN+7    42) SIGRTMIN+8
7)  SIGRTMIN+9    44) SIGRTMIN+10    45) SIGRTMIN+11    46) SIGRTMIN+12    47) SIGRTMIN+13
8)  SIGRTMIN+14    49) SIGRTMIN+15    50) SIGRTMAX-14    51) SIGRTMAX-13    52) SIGRTMAX-12
9)  SIGRTMAX-11    54) SIGRTMAX-10    55) SIGRTMAX-9    56) SIGRTMAX-8    57) SIGRTMAX-7
10) SIGRTMAX-6    59) SIGRTMAX-5    60) SIGRTMAX-4    61) SIGRTMAX-3    62) SIGRTMAX-2
11) SIGRTMAX-1    64) SIGRTMAX    

$ kill -l 1    #打印信号编号(1)对应的信号声明
HUP

$ kill -l HUP  #打印信号声明HUP对应的信号编号
1

部分信号代表的含义:

1  HUP    挂起
2  INT    中断
3  QUIT   结束运行
9  KILL   无条件终止
11 SEGV   段错误
15 TERM   尽可能终止
17 STOP   无条件停止运行,但不终止
18 TSTP   停止或暂停,但继续在后台运行
19 CONT   在STOP或TSTP之后恢复执行

kill 命令实际上是向进程发送一个信号,这个信号就是上面提到的信号编号或者信号声明,并根据这个信号进行处理。

$ kill 61425

kill 命令默认发送的是 TERM 信号(编号 15 ),也就是也就是尽可能终止的意思(因此经常会碰到终止失败的现象),而要想强制终止可用 -s KILL 选项来实现,如下:

$ kill -s KILL 4832   #或者 kill -KILL 4832,亦或 kill -n 9 4832
  • kill 命令停止某个进程,必须是指定进程的属主或者 root 用户
  • kill 命令的参数是进程的 PID,因此有时候会因为难以找到 PID 而犯愁。

6. killall 终止指定服务/程序所对应的所有进程

kill 只能杀死 1 个进程,包含多个进程的服务需要多次使用 kill,而 killall 则可以一次性杀死服务对应的所有进程

命令语法:killall [选项] [服务/程序名]

$ killall wpsoffice    # 关闭 wpsoffice 程序
killall 命令支持通配符