• Linux 命令详解


    完整文档

    ps 命令用于显示命令执行瞬间的进程状态(Process Status)。如果想动态查看进程状态可以使用 top 命令。

    进程的概念

    进程类型

    前台进程:由终端初始化,可以通过命令行进行交互。需要由用户启动,不能作为系统功能或服务的一部分自动启动。
    后台进程:进程在后台运行,没有连接到终端,无法跟用户交互。
    守护进程:特殊的后台进程,在系统启动时启动,并作为服务一直运行。作为系统任务启动(作为服务运行)。用户可以通过 init 进程进行控制。

    进程如何创建

    每个进程都有一份内存空间,当对已有进程的内存空间进行完整复制,就可以创建出一个新的进程。子进程和父进程只有进程的 PID 不同。

    Linx 中有两种方式创建进程:

    • system() 函数:简单低效,有明显的安全隐患。
    • fork() 和 exec() 函数:复杂,更加灵活、快速安全。

    区分进程

    每个进程都有系统中独一无二的进程 ID(PID)。每个进程都有父进程的进程 ID(PPID)。

    Linux 系统启动后,内核首先运行 init 进程(Linux 中所有进程的父进程)。init 进程的 PID 为 1。其他所有进程都是通过 fork 这个 init 进程得到的。

    如果只是想查看某个进程的 PID,可以使用 pidof 命令,例如:

    pidof systemd
    1085

    启动进程

    执行命令即可启动前台进程,可以使用 Ctrl + Z 给前台进程发送 SIGSTOP 信号暂停进程并转入后台运行:

    ./my.shell

    jobs 命令可以查看后台进程,bg 命令可以启动刚转入后台并暂停的进程。fg 加 PID 可以将后台进程转为前台进程。
    在命令后面添加 & 符号则可以启动后台进程。

    ./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
    ...
  • 相关阅读:
    subplots
    异步方法:用async关键字修饰的方法
    async、await原理揭秘
    TCP/IP概述
    EFCore中的IEnumerable和IQueryable的不同之处
    IQueryable底层是如何读取数据的?
    二叉树性质
    几种查找算法
    EFCore中所谓IQueryable
    常用位运算
  • 原文地址:https://www.cnblogs.com/kika/p/10851554.html
Copyright © 2020-2023  润新知