ps进程管理
ps进程管理
进程是程序的运行实例。运行在一台计算机中的多个进程都被分配了一个称为进程ID(PID)的唯一数字标识。同一个程序的多个实例可以同时运行,但是它们的PID却互不相同。进程包括多种属性,例如拥有该进程的用户、进程使用的内存数量,进程占用的cpu时间等。
和进程管理相关的重要命令是top、ps和pgrep。
ps是收集进程信息的重要工具。它提供的信息包括:拥有进程的用户、进程的起始时间、进程对应的命令行路径、PID、进程所属的终端(TTY)、进程使用的内存、进程占用的CPU等。例如:
[root@jenkins ~]# ps PID TTY TIME CMD 1980 pts/0 00:00:00 bash 2058 pts/0 00:00:00 ps
ps命令通常结合一些参数使用。如果不使用任何参数,ps将显示运行在当前终端(TTY)中的进程。第一列显示的进程的ID(PID),第二列是TTY(终端),第三列是进程启动后过去的时间,最后一列是CMD(进程所对应的命令)。
ps命令基本选项参数说明: a:显示现行终端机下的所有程序,包括其他用户的程序。 c:列出程序时,显示每个程序真正的指令名称,而不包含路径,选项或常驻服务的标示。 e:列出程序时,显示每个程序所使用的环境变量。 f:用ASCII字符显示树状结构,表达程序间的相互关系。 g:显示现行终端机下的所有程序,包括群组领导者的程序。 h:不显示标题列。 u:以用户为主的格式来显示程序状况。 x:显示所有程序,不以终端机来区分。 r:只列出现行终端机正在执行中的程序。 v:采用虚拟内存的格式显示程序状况 -a:显示所有终端机下执行的程序,除了阶段作业领导者之外。 -c:显示CLS和PRI栏位。 -d:显示所有程序,但不包括阶段作业领导者的程序。 -e:显示所有程序。 -f:显示UID,PPIP,C与STIME栏位。 -H:显示树状结构,表示程序间的相互关系。 -u<用户识别码>:列出属于该用户的程序的状况,也可使用用户名称来指定。 -j:采用工作控制的格式显示程序状况 -l或l:采用详细的格式来显示程序状况。 -N:显示所有的程序,除了执行ps指令终端机下的程序之外。
例如:
[root@jenkins ~]# ps -aux | head -8 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.2 125340 3772 ? Ss 3月16 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 2 0.0 0.0 0 0 ? S 3月16 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 3月16 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< 3月16 0:00 [kworker/0:0H] root 7 0.0 0.0 0 0 ? S 3月16 0:00 [migration/0] root 8 0.0 0.0 0 0 ? S 3月16 0:00 [rcu_bh] root 9 0.0 0.0 0 0 ? S 3月16 0:01 [rcu_sched]
USER : 进程所属用户
PID : 进程的ID
%CPU : 进程占用CPU的百分比
%MEM : 进程占用内存的百分比
VSZ : 占用虚拟内存量(KB)
RSS : 占用固定内存量(KB)
TTY : 进程运行的终端
STAT : 进程的状态字符
START: 进程被触发启动的时间。
TIME : 进程实际使用CPU运行的时间。
COMMAND : 进程所对应的命令
其中STAT(进程的状态字符),不同的状态对应不同的字符,如下:
D 无法中断的休眠状态(通常 IO 的进程); R 正在运行可中在队列中可过行的; S 处于休眠状态; T 停止或被追踪; W 进入内存交换 (从内核2.6开始无效); X 死掉的进程 (基本很少見); Z 僵尸进程; < 优先级高的进程 N 优先级较低的进程 L 有些页被锁进内存; s 进程的领导者(在它之下有子进程); l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads); + 位于后台的进程组;
ps还可以用-o来指定需要显示的列,以便只打印出我们需要的内容。例如:
[root@jenkins ~]# ps -eo pid,comm | head -6 #只打印pid和命令,前6行 PID COMMAND 1 systemd 2 kthreadd 3 ksoftirqd/0 5 kworker/0:0H 7 migration/0
对应的参数及其描述如下:
pcpu CPU占用率 pid 进程PID ppid 父进程ID pmem 内存使用率 comm 进程对应的命令名 user 启动进程的用户 nice 优先级 time 累计的CPU时间 etime 进程启动后流逝的时间 tty 启动进程的tty设备 euid 有效用户ID stat 进程状态
根据参数对ps输出进行排序
可以用 --sort 将 ps 命令的输出根据特定的列进行排序。在参数钱满加上+(升序)或者-(降序)来指定排序方式,例如:
[root@jenkins ~]# ps -eo comm,pid,pcpu,pmem --sort -pmem | head -7 #按照使用内存的降序排列,提取前7行
COMMAND PID %CPU %MEM
tuned 1008 0.0 0.8
polkitd 743 0.0 0.5
NetworkManager 752 0.0 0.4
vmtoolsd 742 0.0 0.3
VGAuthService 741 0.0 0.3
rsyslogd 748 0.0 0.2
[root@jenkins ~]# ps -eo comm,pid,pcpu,pmem --sort +pmem | head -7 #按照使用内存的升序排列,提取前7行
COMMAND PID %CPU %MEM
kthreadd 2 0.0 0.0
ksoftirqd/0 3 0.0 0.0
kworker/0:0H 5 0.0 0.0
migration/0 7 0.0 0.0
rcu_bh 8 0.0 0.0
rcu_sched 9 0.0 0.0
找出给定命令所对应的进程ID
假设某个命令有多个实例正在运行,我们可能需要识别这些进程的PID。可以使用以下方法,例如:
[root@jenkins ~]# ps -C nginx PID TTY TIME CMD 2049 ? 00:00:00 nginx 2050 ? 00:00:00 nginx [root@jenkins ~]# ps -C nginx -o pid= 2049 2050
或者使用pgrep
[root@jenkins ~]# pgrep nginx 2049 2050
# pgrep 只需要命令的一部分作为输入参数来提取nginx命令的进程ID列表,例如:
[root@jenkins ~]# pgrep ngin 2049 2050 [root@jenkins ~]# pgrep ginx 2049 2050
但是ps需要你输入命令准确的全名
显示进程的环境变量
了解某个进程依赖哪些环境变量,这类信息我们通常都用的着。进程的运行方式可能及其依赖某组环境变量。要在ps的输出条目中同事列出环境变量,可以使用:
[root@jenkins ~]# ps -eo cmd e
例如:
[root@jenkins ~]# ps -eo pid,comm,cmd e | grep nginx 2049 nginx /etc/ngin nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf /etc/nginx/nginx.conf 2050 nginx nginx: worker process 2742 grep XDG_SESSIO grep --color=auto nginx XDG_SESSION_ID=27 HOSTNAME=jenkins TERM=xterm SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=192.168.11.156 59028 22 SSH_TTY=/dev/pts/0 USER=root LS_COLORS=rs=0:di=01;34:ln=01;
36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:
*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:
*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=
01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:
*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:
*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:
*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36: MAIL=/var/spool/mail/root PATH=/usr/local/mongodb/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin PWD=/root LANG=zh_CN.UTF-8 HISTCONTROL=ignoredups
SHLVL=1 HOME=/root LOGNAME=root SSH_CONNECTION=192.168.11.156 59028 192.168.11.153 22 LESSOPEN=||/usr/bin/lesspipe.sh %s XDG_RUNTIME_DIR=/run/user/0 _=/usr/bin/grep
或者
[root@jenkins ~]# ps -eo pid,comm,cmd -e | grep nginx 2049 nginx nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf 2050 nginx nginx: worker process
[root@jenkins ~]# ps -eo pid,ppid,comm,cmd -e | grep mongo | grep -v grep 2817 1 mongod mongod -f /usr/local/mongodb/etc/mongodb.conf
ps命令详细帮助文件可查看man帮助
[root@jenkins ~]# man ps
记录一些提取某些进程的pid的方式:
[root@jenkins ~]# ps -aux | grep nginx |grep -v grep | awk '{print $2}' 2049 2050 [root@jenkins ~]# ps -eo pid,comm | grep nginx | awk '{print $1}' 2049 2050 [root@jenkins ~]# ps -C nginx | awk '{print $1}' | grep -v 'PID' 2049 2050 [root@jenkins ~]# pgrep nginx | awk '{print $1}' 2049 2050 等等……………………