ps命令详解

还是在看disown的问题,发现就算是disown或者nohup了一个进程,他所属的pgid和sid也没有变化嘛,好谜,索性这里把ps命令的参数和输出都过一遍吧。

常用命令

ps命令支持三种使用的语法格式

  • UNIX 风格,选项可以组合在一起,并且选项前必须有“-”连字符
  • BSD 风格,选项可以组合在一起,但是选项前不能有“-”连字符
  • GNU 风格的长选项,选项前有两个“-”连字符

UNIX风格

1
2
3
4
$ ps -e
PID TTY TIME CMD
1 ? 00:00:07 systemd
2 ? 00:00:00 kthreadd

这里-e相当于-A输出所有进程

1
2
3
4
$ ps -ely
S UID PID PPID C PRI NI RSS SZ WCHAN TTY TIME CMD
S 0 1 0 0 80 0 1380 5737 - ? 00:00:07 systemd
S 0 2 0 0 80 0 0 0 - ? 00:00:00 kthreadd

l会加上UID PID PPID C PRI NI ADDR SZ WCHAN这些参数,y是使用RSS替换ADDR

1
2
3
4
5
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Apr22 ? 00:00:07 /sbin/init
root 2 0 0 Apr22 ? 00:00:00 [kthreadd]
root 3 2 0 Apr22 ? 00:00:51 [ksoftirqd/0]

-f就是加了UID PPID C STIME

1
2
3
4
5
$ ps -eF
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 1 0 0 5737 1380 0 Apr22 ? 00:00:07 /sbin/init
root 2 0 0 0 0 0 Apr22 ? 00:00:00 [kthreadd]
root 3 2 0 0 0 0 Apr22 ? 00:00:51

-F加了更多,虽然不知道实际用到多少

BSD风格

a是显示全部,ax会显示没有终端的进程。

1
2
3
4
$ ps ax
PID TTY STAT TIME COMMAND
1 ? Ss 0:07 /sbin/init
2 ? S 0:00 [kthreadd]
1
2
3
4
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 22948 1380 ? Ss Apr22 0:07 /sbin/init
root 2 0.0 0.0 0 0 ? S Apr22 0:00

u是Display user-oriented format. 就是加了USER PID %CPU %MEM VSZ RSS STAT START这些,还是很有用的。

树结构

ps axjf

1
2
3
4
5
6
7
8
9
10
$ ps axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 2 0 0 ? -1 S 0 0:00 [kthreadd]
2 3 0 0 ? -1 S 0 0:52 \_ [ksoftirqd/0]
2 5 0 0 ? -1 S< 0 0:00 \_ [kworker/0:0H]
2 7 0 0 ? -1 S 0 0:46 \_ [rcu_sched]
2 8 0 0 ? -1 S 0 0:00 \_ [rcu_bh]
2 9 0 0 ? -1 S 0 1:38 \_ [rcuc/0]
2 10 0 0 ? -1 S 0 0:00 \_ [migration/0]
2 11 0 0 ? -1 S 0 0:00 \_ [cpuhp/0]

j是BSD job control输出,f是树状输出

参数解释

-ely来的
  • S 进程状态(比STAT短,没有>,+之类的)
  • UID 执行者身份
  • PID 进程ID
  • PPID 父进程ID
  • C CPU 使用的资源百分比
  • PRI 指进程的执行优先权,其值越小越早被执行
  • NI 这个进程的nice值,其表示进程可被执行的优先级的修正数值
  • ADDR 这个是内核函数,指出该程序在内存的那个部分。如果是个执行的程序,一般就是
  • RSS 该进程占用的固定的内存量 (Kbytes)
  • SZ 使用掉的内存大小
  • WCHAN 目前这个程序是否正在运作当中,若为 - 表示正在运作;
  • TTY 登入者的终端机
j来的
  • PPID 父进程ID
  • PID 进程ID
  • PGID 进程组ID
  • SID session ID
  • TTY
  • TPGID tty进程的id(zsh的id)
  • STAT

日常

  • ps j -C 进程名字
  • ps j -s sessionID号
  • ps -eLf 可以看到所有线程(LWP = TID, NLWP = 线程数)