当前位置 博文首页 > Linux猿:大厂面试必问命令!不要再说不了解了!详解+实例!

    Linux猿:大厂面试必问命令!不要再说不了解了!详解+实例!

    作者:[db:作者] 时间:2021-09-17 09:06

    在大厂面试中,ps 是面试常问命令,本文为大家讲解下面试常问的参数,ps 命令在日常的使用频率非常高,通常用于查看进程的状态,赶紧来看一下吧!

    一、基本概念

    ps (process status 的简称)用于显示当前进程状态,可以查看当前运行进程的各种信息,是从/proc目录下读取进程信息。如果要实时查看进程的状态,使用top 命令。

    ps 有三种形式,如下所示:

    1、?UNIX 选项,可以分组并且必须以破折号 “-” 开头,例如:ps -ef ;

    2、?BSD 选项,可以分组并且不能与破折号一起使用,例如:ps aux;

    3、?GNU 长选项,前面有两个破折号,例如:ps --user。

    本文讲解采用第一种 UNIX 选项。

    1.1 语法格式? ??

    ? ?ps [参数]…

    可以没有参数或者包含多个参数。

    1.2 常用参数

    -A,-e? : 列出所有进程;

    -f : 列出所有的列,通常与其它参数结合使用;

    -a : 列出所有进程,除了会话领导进程以及与终端无关的进程;

    -u : 列出指定用户/用户ID的进程;

    -j : 以作业形式列出进程;

    -H : 显示进程层次结构;

    二、实例

    1. 无参数

    直接执行 ps 命令,列出当前会话中的进程,如下所示:

    linuxy@linuxy:~$ ps
        PID TTY          TIME CMD
       2307 pts/1    00:00:00 bash
       2677 pts/1    00:00:00 ps
    linuxy@linuxy:~$

    其中,各列代表的意思是:

    PID : 进程 ID;

    TTY : 终端类型;若当前进程与终端无关,则显示 ?。

    TIME : 时间;

    CMD :执行命令;?

    2. -A 参数

    列出所有进程,也包括非当前用户的进程,如下所示:

    linuxy@linuxy:~$ ps -A
        PID TTY          TIME CMD
          1 ?        00:00:03 systemd
          2 ?        00:00:00 kthreadd
          3 ?        00:00:00 rcu_gp
          4 ?        00:00:00 rcu_par_gp
          6 ?        00:00:00 kworker/0:0H-kblockd
          9 ?        00:00:00 mm_percpu_wq
         10 ?        00:00:00 ksoftirqd/0
         11 ?        00:00:00 rcu_sched
         12 ?        00:00:00 migration/0
         13 ?        00:00:00 idle_inject/0
         14 ?        00:00:00 cpuhp/0
         15 ?        00:00:00 cpuhp/1
         ......

    使用? -e 参数,作用与 -A 参数相同,如下所示:

    linuxy@linuxy:~$ ps -e
        PID TTY          TIME CMD
          1 ?        00:00:03 systemd
          2 ?        00:00:00 kthreadd
          3 ?        00:00:00 rcu_gp
          4 ?        00:00:00 rcu_par_gp
          6 ?        00:00:00 kworker/0:0H-kblockd
          9 ?        00:00:00 mm_percpu_wq
         10 ?        00:00:00 ksoftirqd/0
         11 ?        00:00:00 rcu_sched
         12 ?        00:00:00 migration/0
         13 ?        00:00:00 idle_inject/0
         14 ?        00:00:00 cpuhp/0
         15 ?        00:00:00 cpuhp/1
         ......

    ?3. -f 参数

    列出所有的列,显示进程更详细的信息,如下所示:

    linuxy@linuxy:~$ ps -ef
    UID          PID    PPID  C STIME TTY          TIME CMD
    root           1       0  0 19:55 ?        00:00:03 /sbin/init splash
    root           2       0  0 19:55 ?        00:00:00 [kthreadd]
    root           3       2  0 19:55 ?        00:00:00 [rcu_gp]
    root           4       2  0 19:55 ?        00:00:00 [rcu_par_gp]
    root           6       2  0 19:55 ?        00:00:00 [kworker/0:0H-kblockd]
    root           9       2  0 19:55 ?        00:00:00 [mm_percpu_wq]
    root          10       2  0 19:55 ?        00:00:00 [ksoftirqd/0]
    ......

    与单独使用 -e 参数相比,多出了 UID、PPID、C、STIME 四列,分别表示:

    UID :用户;

    PPID : 父进程ID;

    C :?进程占用CPU的百分比;

    STIME :?进程启动的时间;

    ?4. -a 参数

    列出所有进程,除了会话领导进程以及与终端无关的进程,如下所示:

    linuxy@linuxy:~$ ps -a
        PID TTY          TIME CMD
       1518 tty2     00:00:02 Xorg
       1536 tty2     00:00:00 gnome-session-b
       2733 pts/1    00:00:00 man
       2743 pts/1    00:00:00 pager
       2872 pts/2    00:00:00 ps
    linuxy@linuxy:~$

    5. -u 参数

    列出指定用户/用户ID的进程,如下所示:

    linuxy@linuxy:~$ ps -u linuxy
        PID TTY          TIME CMD
       1559 ?        00:00:00 systemd
       1560 ?        00:00:00 (sd-pam)
       1566 ?        00:00:02 pulseaudio
       1568 ?        00:00:00 tracker-miner-f
       1572 ?        00:00:00 dbus-daemon
       1587 ?        00:00:00 gvfsd
       1592 ?        00:00:00 gvfsd-fuse
       1598 ?        00:00:00 gvfs-udisks2-vo
       1601 ?        00:00:00 gnome-keyring-d
       ......

    可以列出多个用户的进程,如下所示:

    linuxy@linuxy:~$ ps -u linuxy,root
        PID TTY          TIME CMD
          1 ?        00:00:06 systemd
          2 ?        00:00:00 kthreadd
          3 ?        00:00:00 rcu_gp
          4 ?        00:00:00 rcu_par_gp
          6 ?        00:00:00 kworker/0:0H-kblockd
          9 ?        00:00:00 mm_percpu_wq
         10 ?        00:00:00 ksoftirqd/0
         11 ?        00:00:05 rcu_sched
         ......

    ?多个用户可以使用 “,” 分隔或使用多个 -u 参数。

    默认情况下(不指定用户),ps 选择与当前用户具有相同有效用户 ID 并与调用者相同的终端关联的所有进程。

    6. -j,-H 参数?

    通常 -j 和 -H 参数一起使用,如下所示:

    linuxy@linuxy:~$ ps -ejH
        PID    PGID     SID TTY          TIME CMD
          2       0       0 ?        00:00:00 kthreadd
          3       0       0 ?        00:00:00   rcu_gp
        ......
        ......
        887     887     887 ?        00:00:00   sshd
       5341    5341    5341 ?        00:00:00     sshd
       5456    5341    5341 ?        00:00:00       sshd
       5480    5480    5480 pts/2    00:00:00         bash
       ......

    可以看到,三个 sshd 进程以及 bash 以层次形式显示,查看下这些进程之间的关系,如下所示:

    linuxy@linuxy:~$ ps -ef | grep 5341
    root        5341     887  0 21:51 ?        00:00:00 sshd: linuxy [priv]
    linuxy      5456    5341  0 21:51 ?        00:00:00 sshd: linuxy@pts/2
    linuxy      5934    5480  0 22:50 pts/2    00:00:00 grep --color=auto 5341
    linuxy@linuxy:~$

    ? 可以看到,进程 887 是 5341 的父进程,5341 是 5456 的父进程,和层次关系一一对应。

    三、总结

    ps 是在日常操作中使用频率很高的一个命令,上面讲解了常用的命令参数,接下来的文章还会更加深入的讲解。

    参考文献:

    [1] Ubuntu man 手册;

    cs