Linux 命令詳解 - ps

完整文檔php

ps 命令用於顯示命令執行瞬間的進程狀態(Process Status)。若是想動態查看進程狀態可使用 top 命令。css

進程的概念

進程類型

前臺進程:由終端初始化,能夠經過命令行進行交互。須要由用戶啓動,不能做爲系統功能或服務的一部分自動啓動。
後臺進程:進程在後臺運行,沒有鏈接到終端,沒法跟用戶交互。
守護進程:特殊的後臺進程,在系統啓動時啓動,並做爲服務一直運行。做爲系統任務啓動(做爲服務運行)。用戶能夠經過 init 進程進行控制。html

進程如何建立

每一個進程都有一分內存空間,當對已有進程的內存空間進行完整複製,就能夠建立出一個新的進程。子進程和父進程只有進程的 PID 不一樣。mysql

Linx 中有兩種方式建立進程:linux

  • system() 函數:簡單低效,有明顯的安全隱患。
  • fork() 和 exec() 函數:複雜,更加靈活、快速安全。

區分進程

每一個進程都有系統中獨一無二的進程 ID(PID)。每一個進程都有父進程的進程 ID(PPID)。nginx

Linux 系統啓動後,內核首先運行 init 進程(Linux 中全部進程的父進程)。init 進程的 PID 爲 1。其餘全部進程都是經過 fork 這個 init 進程獲得的。web

若是隻是想查看某個進程的 PID,可使用 pidof 命令,例如:sql

pidof systemd
1085

啓動進程

執行命令便可啓動前臺進程,可使用 Ctrl + Z 給前臺進程發送 SIGSTOP 信號暫停進程並轉入後臺運行:shell

./my.shell

jobs 命令能夠查看後臺進程,bg 命令能夠啓動剛轉入後臺並暫停的進程。fg 加 PID 能夠將後臺進程轉爲前臺進程。
在命令後面添加 & 符號則能夠啓動後臺進程。centos

./my.shell &

進程狀態

Linux 中進程的 5 種狀態:

  1. 運行 Running:正在運行或準備運行(在運行隊列中等待)
  2. 等待 Waiting :等待某個條件的造成或系統資源,分爲兩種:
    • 中斷:能夠被信號中斷
    • 不可中斷:正在等待硬件條件(IO),不能被任何事件或信號中斷
  3. 僵死 Zombie:進程已終止,但進程描述符存在,直到父進程調用 wait4() 系統調用後釋放
  4. 中止 Stopped:進程收到 SIGSTOP、SIGSTP、SIGTIN、SIGTOU 信號後中止運行

pstree 命令

pstree 能夠顯示整個進程樹:

[root@VM_120_242_centos ~]# pstree
systemd─┬─acpid
        ├─2*[agetty]
        ├─atd
        ├─auditd───{auditd}
        ├─barad_agent─┬─barad_agent
        │             └─barad_agent─┬─sh─┬─grep
        │                           │    ├─ntpdate
        │                           │    └─sed
        │                           └─3*[{barad_agent}]
        ├─chronyd
        ├─crond
        ├─dbus-daemon
        ├─gssproxy───5*[{gssproxy}]
        ├─lsmd
        ├─lvmetad
        ├─mysqld───35*[{mysqld}]
        ├─nginx───nginx
        ├─php-fpm───32*[php-fpm]
        ├─polkitd───5*[{polkitd}]
        ├─rpc.statd
        ├─rpcbind
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sap1002
        ├─sap1004
        ├─sap1005
        ├─sap1009
        ├─secu-tcs-agent
        ├─sgagent───{sgagent}
        ├─sshd───sshd───bash───pstree
        ├─svnserve
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        └─vsftpd

ps 命令

進程的 5 種狀態碼:

D 不可中斷,一般是 IO
R 運行 runnable (on run queue)
S 中斷 sleeping
T 中止 traced or stopped
Z 僵死 zombie process

命令參數:

-A 顯示全部進程
-e 等於「-A」
e 顯示環境變量
-f 顯示程序間的關係
-u 指定用戶的全部進程
-aux 顯示全部包含其餘使用者的行程

示例

查看全部的進程

-e-A 能夠列出所有進程

示例:

ps -e
  PID TTY          TIME CMD
    1 ?        01:27:34 systemd
    2 ?        00:00:01 kthreadd
    3 ?        00:11:22 ksoftirqd/0
    ...

查看某個用戶的進程

示例:

ps -u root
  PID TTY          TIME CMD
    1 ?        00:00:16 systemd
    2 ?        00:00:00 kthreadd
    3 ?        00:04:25 ksoftirqd/0
    5 ?        00:00:00 kworker/0:0H
    ...

指定只顯示某幾個字段

-o pid,ppid,comm,cmd 能夠只顯示 PID,PPID,COMMAND,CMD

示例:

[root@VM_120_242_centos ~]# ps -eo pid,ppid,comm,cmd
  PID  PPID COMMAND         CMD
    1     0 systemd         /usr/lib/systemd/systemd --system --deserialize 23
    2     0 kthreadd        [kthreadd]
    3     2 ksoftirqd/0     [ksoftirqd/0]
    5     2 kworker/0:0H    [kworker/0:0H]
    7     2 migration/0     [migration/0]
 1011   738 sshd            sshd: root@pts/0
 1013  1011 bash            -bash
 2337  1013 ps              ps -eo pid,ppid,comm,cmd
 3671 31510 php-fpm         php-fpm: pool www
 4062 31510 php-fpm         php-fpm: pool www
 7839 31510 php-fpm         php-fpm: pool www
31510     1 php-fpm         php-fpm: master process (/etc/php-fpm.conf)
    ...

查看環境變量

e 能夠查看環境變量。

示例:

ps e PID TTY STAT TIME COMMAND 1013 pts/0 Ss 0:00 -bash USER=root LOGNAME=root HOME=/root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin MAIL=/var/mail/root SHELL=/bin/bash SSH_CLIENT=183.15.178.23 60777 22 SSH_CONNECTION=183.15.178.23 60777 10.135.120.242 22 SSH_TTY=/dev/pts/0 TERM=x 1239 pts/0 R+ 0:00 ps e XDG_SESSION_ID=1408128 HOSTNAME=VM_120_242_centos TERM=xterm SHELL=/bin/bash HISTSIZE=3000 SSH_CLIENT=183.15.178.23 60777 22 QTDIR=/usr/lib64/qt-3.3 QTINC=/usr/lib64/qt-3.3/include SSH_TTY=/dev/pts/0 QT_GRAPHICSSYSTEM_CHECKED=1 USER=root ...

顯示全部進程信息

-f 能夠查看比 -e 更多的字段。

示例:

[root@VM_120_242_centos ~]# ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
root      1013  1011  0 12:41 pts/0    00:00:00 -bash
root      1425  1013  0 12:45 pts/0    00:00:00 ps -f

[root@VM_120_242_centos ~]# ps
  PID TTY          TIME CMD
 1013 pts/0    00:00:00 bash

aux 查看內存中的進程

-aux 能夠查看環境變量

示例:

[root@VM_120_242_centos ~]# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2 188708  2268 ?        Ss    2017  87:34 /usr/lib/systemd/systemd --system --deserialize 23
root         2  0.0  0.0      0     0 ?        S     2017   0:01 [kthreadd]
root         3  0.0  0.0      0     0 ?        S     2017  11:22 [ksoftirqd/0]
...

配合 grep 查找特定進程

示例:

[root@VM_120_242_centos ~]# ps -e | grep ssh
  738 ?        00:09:18 sshd
 1011 ?        00:00:00 sshd
[root@VM_120_242_centos ~]# ps -e | grep svn
 9780 ?        00:00:05 svnserve

列出進程樹 -axjf

[root@VM_120_242_centos ~]# ps -axjf
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    0     2     0     0 ?           -1 S        0   0:01 [kthreadd]
    2     3     0     0 ?           -1 S        0  11:22  \_ [ksoftirqd/0]
    2     5     0     0 ?           -1 S<       0   0:00  \_ [kworker/0:0H]
    2     7     0     0 ?           -1 S        0   0:00  \_ [migration/0]
  738  1011  1011  1011 ?           -1 Ss       0   0:00  \_ sshd: root@pts/0 1011 1013 1013 1013 pts/0 2132 Ss 0 0:00 \_ -bash 1013 2132 2132 1013 pts/0 2132 R+ 0 0:00 \_ ps -axjf 31510 31511 31510 31510 ? -1 S 48 0:19 \_ php-fpm: pool www 31510 31512 31510 31510 ? -1 S 48 2:18 \_ php-fpm: pool www 31510 31513 31510 31510 ? -1 S 48 0:19 \_ php-fpm: pool www 1 12438 12438 12438 ? -1 Ss 0 0:00 nginx: master process /usr/sbin/nginx 12438 8540 12438 12438 ? -1 S 994 0:12 \_ nginx: worker process ...
相關文章
相關標籤/搜索