linux命令:ps、netstat

日常我们查看服务,进程,端口,路径等等都可以用到这两个命令,因为我记得也不够详细,这里为了提升自己运用能力,特写此文章。

一、ps命令

ps命令(process status)用于显示当前进程的状态,类似于Windows中的任务管理器。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。

1.Linux上进程的简单介绍
(1)Linux上进程的状态:
1)运行(正在运行或在运行队列中等待)
2)中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
3)不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
4)僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
5)停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)

(2)ps工具标识进程的5种状态码:
1)R 运行 runnable (on run queue)
2)S 中断 sleeping
3)D 不可中断 uninterruptible sleep (usually IO)
4)Z 僵死 a defunct (”zombie”) process
5)T 停止 traced or stopped

2.ps命令的语法

ps [options] [--help]
参数 作用
a 显示所有进程
-a 显示同一终端下的所有程序
-A 显示所有进程
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的进程
c 显示进程的真实名称
e 显示环境变量
-e 等于“-A”
f 显示程序间的关系
-H 显示树状结构
-N 反向选择
r 显示当前终端的进程
T 显示当前终端的所有程序
u 指定用户的所有进程
-C<命令> 列出指定命令的状况
–lines<行数> 每页显示的行数
–width<字符数> 每页显示的字符数
–help 显示帮助信息
–version 显示版本显示

注意:
  由于 ps 能够支持的系统类型相当的多,所以他的参数多的离谱!而且有没有加上 - 差很多!详细的用法应该要参考man ps!!!

3.实例
帮助理解,实例是少不了的!!
(1)ps -ef
  显示所有进程信息,连同命令行

[root@localhost /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Nov09 ?        00:02:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2     0  0 Nov09 ?        00:00:00 [kthreadd]
root         4     2  0 Nov09 ?        00:00:00 [kworker/0:0H]
root         6     2  0 Nov09 ?        00:00:03 [ksoftirqd/0]
root         7     2  0 Nov09 ?        00:00:00 [migration/0]
root         8     2  0 Nov09 ?        00:00:00 [rcu_bh]
root         9     2  0 Nov09 ?        00:01:42 [rcu_sched]
......

(2)ps -ef | grep ssh
  ps与grep组合使用,常用来查找特定进程

[root@localhost ~]# ps -ef | grep ssh
root      1266     1  0 Nov09 ?        00:00:00 /usr/sbin/sshd -D
root      6954  1266  0 15:30 ?        00:00:00 sshd: root@pts/0
root      7072  6957  0 15:32 pts/0    00:00:00 grep --color=auto ssh

(3)ps aux
  显示目前所有的正在内存中的程序(或进程)

[root@localhost /]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  51736  3144 ?        Ss   Nov09   1:48 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2  0.0  0.0      0     0 ?        S    Nov09   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        S<   Nov09   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    Nov09   0:02 [ksoftirqd/0]
root         7  0.0  0.0      0     0 ?        S    Nov09   0:00 [migration/0]
root         8  0.0  0.0      0     0 ?        S    Nov09   0:00 [rcu_bh]
root         9  0.0  0.0      0     0 ?        S    Nov09   1:31 [rcu_sched]
root        10  0.0  0.0      0     0 ?        S<   Nov09   0:00 [lru-add-drain]
root        11  0.0  0.0      0     0 ?        S    Nov09   0:02 [watchdog/0]
......

详解:
USER:该 process 属于那个使用者账号的
PID:该 process 的号码
%CPU:该 process 使用掉的 CPU 资源百分比
%MEM:该 process 所占用的物理内存百分比
VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
RSS :该 process 占用的固定的内存量 (Kbytes)
TTY :该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
STAT:该程序目前的状态,主要的状态有
  R:该程序目前正在运作,或者是可被运作
  S:该程序目前正在睡眠当中 (可说是 idle 状态),但可被某些讯号 (signal) 唤醒。
  T:该程序目前正在侦测或者是停止了
  Z:该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
START:该 process 被触发启动的时间
TIME:该 process 实际使用 CPU 运作的时间
COMMAND:该程序的实际指令

(4)ps -l
  将目前登录的PID与相关信息列示出来

[root@localhost /]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0 14880 14877  0  80   0 - 28887 do_wai pts/0    00:00:00 bash
0 R     0 23906 14880  0  80   0 - 38338 -      pts/0    00:00:00 ps

详解:
F:代表这个程序的旗标 (flag), 4 代表使用者为 super user
S:代表这个程序的状态 (STAT),关于各 STAT 的意义将在内文介绍
UID:程序被该 UID 所拥有
PID:就是这个程序的 ID !
PPID:则是其上级父程序的ID
C:CPU使用的资源百分比
PRI:这个是 Priority (优先执行序) 的缩写,进程优先权,代表这个进程可被执行的优先级,其值越小,优先级就越高,越早被执行
NI:这个是 Nice 值,代表这个进程的优先值
ADDR:这个是 kernel function,指出该程序在内存的那个部分。如果是个 running的程序,一般就是 “-”
SZ:使用掉的内存大小
WCHAN:目前这个程序是否正在运作当中,若为 - 表示正在运作
TTY:登入者的终端机位置
TIME:使用掉的 CPU 时间。
CMD:所下达的指令为何
在预设的情况下, ps 仅会列出与目前所在的 bash shell 有关的 PID 而已,所以, 当我使用 ps -l 的时候,只有三个 PID。

(5)ps -A
  显示所有的进程信息

[root@localhost /]# ps -A
  PID TTY          TIME CMD
    1 ?        00:02:01 systemd
    2 ?        00:00:00 kthreadd
    4 ?        00:00:00 kworker/0:0H
    6 ?        00:00:03 ksoftirqd/0
    7 ?        00:00:00 migration/0
    8 ?        00:00:00 rcu_bh
    9 ?        00:01:42 rcu_sched
   10 ?        00:00:00 lru-add-drain
   ......

(6)ps -u root
  显示指定用户信息

[root@iZ2ze95cxr3kx9il409khtZ ~]# ps -u root
  PID TTY          TIME CMD
    1 ?        00:02:01 systemd
    2 ?        00:00:00 kthreadd
    4 ?        00:00:00 kworker/0:0H
    6 ?        00:00:03 ksoftirqd/0
    7 ?        00:00:00 migration/0
    8 ?        00:00:00 rcu_bh
    9 ?        00:01:42 rcu_sched
   10 ?        00:00:00 lru-add-drain
   11 ?        00:00:02 watchdog/0
   12 ?        00:00:01 watchdog/1
   ......

(7)ps -axjf
  列出类似程序树的程序显示

[root@localhost /]# ps -axjf
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    0     2     0     0 ?           -1 S        0   0:00 [kthreadd]
    2     4     0     0 ?           -1 S<       0   0:00  \_ [kworker/0:0H]
    2     6     0     0 ?           -1 S        0   0:03  \_ [ksoftirqd/0]
    2     7     0     0 ?           -1 S        0   0:00  \_ [migration/0]
    2     8     0     0 ?           -1 S        0   0:00  \_ [rcu_bh]
    2     9     0     0 ?           -1 S        0   1:42  \_ [rcu_sched]
    2    10     0     0 ?           -1 S<       0   0:00  \_ [lru-add-drain]
    2    11     0     0 ?           -1 S        0   0:02  \_ [watchdog/0]
    2    12     0     0 ?           -1 S        0   0:01  \_ [watchdog/1]
    2    13     0     0 ?           -1 S        0   0:00  \_ [migration/1]
    2    14     0     0 ?           -1 S        0   0:00  \_ [ksoftirqd/1]
    2    16     0     0 ?           -1 S<       0   0:00  \_ [kworker/1:0H]
    2    17     0     0 ?           -1 S        0   0:01  \_ [watchdog/2]
    2    18     0     0 ?           -1 S        0   0:00  \_ [migration/2]
    2    19     0     0 ?           -1 S        0   0:04  \_ [ksoftirqd/2]
    2    21     0     0 ?           -1 S<       0   0:00  \_ [kworker/2:0H]
    2    22     0     0 ?           -1 S        0   0:01  \_ [watchdog/3]
    2    23     0     0 ?           -1 S        0   0:00  \_ [migration/3]
    2    24     0     0 ?           -1 S        0   0:00  \_ [ksoftirqd/3]
    ......

(8)ps -aux | more
  可以用 | 管道和 more 连接起来分页查看

(9)ps -aux > ps001.txt
  把所有进程显示出来,并输出到ps001.txt文件

(10)ps -o pid,ppid,pgrp,session,tpgid,comm
  输出指定的字段

4.进程优先级相关介绍
  Linux中进程模块离不开优先级,这里对进程优先级相关知识进行简单介绍,后续随着深入学习该知识,我会另写相关文章用于Linux中进程和优先级相关学习轨迹的记录。

参考自:
http://blog.csdn.net/longdel/article/details/7317511

(1)相关值
1)PRI
  Priority的缩写,进程优先权,代表这个进程可被执行的优先级,其值越小,优先级就越高,越早被执行。
2)NI
  进程Nice值,代表这个进程的优先值。
3)%ni/%nice
  改变过优先级的进程的占用CPU的百分比。

(2)具体介绍
  PRI即为进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高;NI即为nice值,表示进程可执行的优先级的修正数值。
  PRI值越小,越先执行,加入nice值后,将使PRI变为:PRI(new)=PRI(old)+nice。由此可见,nice值越小,PRI值就越小,优先级就越高,nice值直接影响PRI值,及进程的优先级。
  在LINUX系统中,Nice值的范围从-20到+19(不同系统的值范围是不一样的),正值表示低优先级,负值表示高优先级,值为零则表示不会调整该进程的优先级。具有最高优先级的程序,其nice值最低,所以在LINUX系统中,值-20使得一项任务变得非常重要;与之相反,如果任务的nice为+19,则表示它是一个高尚的、无私的任务,允许所有其他任务比自己享有宝贵的CPU时间的更大使用份额,这也就是nice的名称的来意。
  进程在创建时被赋予不同的优先级值,而如前面所说,nice的值是表示进程优先级值可被修正数据值,因此,每个进程都在其计划执行时被赋予一个nice值,这样系统就可以根据系统的资源以及具体进程的各类资源消耗情况,主动干预进程的优先级值。在通常情况下,子进程会继承父进程的nice值,比如在系统启动的过程中,init进程会被赋予0,其他所有进程继承了这个nice值(因为其他进程都是init的子进程)。
  对nice值一个形象比喻,假设在一个CPU轮转中,有2个runnable的进程A和B,如果他们的nice值都为0,假设内核会给他们每人分配1k个cpu时间片。但是假设进程A的为0,但是B的值为-10,那么此时CPU可能分别给A和B分配1k和1.5k的时间片。故可以形象的理解为,nice的值影响了内核分配给进程的cpu时间片的多少,时间片越多的进程,其优先级越高,其优先级值(PRI)越低。%nice,就是改变过优先级的进程的占用CPU的百分比,如上例中就是0.5k/2.5k=1/5=20%。
  
(3)相关值的设置
1)nice命令
  设置一个要执行command进程的nice值,其命令格式是 nice –n adjustment command command_option,如果这里不指定adjustment,则默认为10。
2)renice命令
  设置一个已经在运行的进程的nice值,假设一运行进程本来nice值为0,renice为3后,则这个运行进程的nice值就为3了。
说明:
  如果用户设置的nice值超过了nice的边界值(LINUX为-20到+19),系统就取nice的边界值作为进程的nice值。

(4)实例
详见http://blog.csdn.net/longdel/article/details/7317511

二、netstat命令

netstat是基于Netstat这个命令行工具的指令,用于显示linux中各种网络相关信息,如tcp、udp、Unix套接字、网络链接、路由表、接口状态链接、多播成员等等。

1.语法

netstat [option] [-A<网络类型>] [--ip]

参数说明:

参数 作用说明
-a或–all 显示所有连线中的Socket(这里其实就是指的端口)
-A<网络类型>或–<网络类型> 列出该网络类型连线中的相关地址
-c或–continuous 持续列出网络状态
-C或–cache 显示路由器配置的快取信息
-e或–extend 显示网络其他相关信息
-F或–fib 显示FIB
-g或–groups 显示多重广播功能群组组员名单
-h或–help 在线帮助
-i或–interfaces 显示网络界面信息表单
-l或–listening 显示监控中的服务器的Socket
-M或–masquerade 显示伪装的网络连线
-n或–numeric 直接使用IP地址,而不通过域名服务器
-N或–netlink或–symbolic 显示网络硬件外围设备的符号连接名称
-o或–timers 显示计时器
-p或–programs 显示正在使用Socket的程序识别码和程序名称
-r或–route 显示Routing Table
-s或–statistics 显示网络工作信息统计表
-t或–tcp 显示TCP传输协议的连线状况
-u或–udp 显示UDP传输协议的连线状况
-v或–verbose 显示指令执行过程
-V或–version 显示版本信息
-w或–raw 显示RAW传输协议的连线状况
-x或–unix 此参数的效果和指定"-A unix"参数相同
–ip或–inet 此参数的效果和指定"-A inet"参数相同

套接字(Socket):
  对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。
  
2.实例
(1)netstat -a
  列出所有的端口信息,包括监听的和未监听的。

[root@iZ2ze95cxr3kx9il409khtZ ~]# netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:simplifymedia   0.0.0.0:*               LISTEN     
tcp        0      0 localhost:7992          0.0.0.0:*               LISTEN     
tcp        0      0 localhost:7993          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:pushns          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:irdmi2          0.0.0.0:*               LISTEN     
tcp        0      0 localhost:43107         0.0.0.0:*               LISTEN     
tcp        0      0 localhost:mxi           0.0.0.0:*               LISTEN     
tcp        0      0 localhost:45573         0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:5701            0.0.0.0:*               LISTEN  
......
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ACC ]     STREAM     LISTENING     16677    @/run/systemd/log-90zMvYX7uL
unix  3      [ ]         DGRAM                    6428     /run/systemd/notify
unix  2      [ ]         DGRAM                    6430     /run/systemd/cgroups-agent
unix  2      [ ACC ]     STREAM     LISTENING     6438     /run/systemd/journal/stdout
unix  5      [ ]         DGRAM                    6441     /run/systemd/journal/socket
unix  9      [ ]         DGRAM                    6443     /dev/log
unix  2      [ ACC ]     SEQPACKET  LISTENING     13364    /run/udev/control
unix  2      [ ACC ]     STREAM     LISTENING     16831    /var/lib/mysql/mysql.sock
unix  2      [ ACC ]     STREAM     LISTENING     17615    /usr/local/aegis/Aegis-(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)>
unix  2      [ ]         DGRAM                    11581    /run/systemd/shutdownd
......

详细说明:
1、Active Internet connections (servers and established)/活动的Internet网络连接(TCP,UDP,raw)
(1)Proto
  socket使用的协议,tcp,udp,raw
(2)Recv-Q
  连接到此套接字的用户程序未复制的字节数
(3)Send-Q
  远程主机不承认(或未确认)的字节数
(4)Local Address
  套接字的本地地址(本地主机名)和端口号。除非给定-n,–numeric选项,否则套接字地址按标准主机名(FQDN)进行解析,而端口到则转换到相应的服务名
(5)Foreign Address
  套接字的远程地址(远程主机名)和端口号
(6)State(socket状态)
  套接字的状态。因为在RAW协议中没有状态,而且UDP也不用状态信息,所以此行留空。
状态分类:

状态 说明
ESTABLISHED 建立状态,正在传输(套接字有一个有效连接)
SYN_SENT socket正在尝试活跃的建立连接(套接字尝试建立一个连接)
SYN_RECV 从网络收到了一个连接请求
FIN_WAIT1 socket是关闭状态,连接正在关闭中
FIN_WAIT2 连接是关闭的,socket正在等待远程关闭
TIME_WAIT 在关闭之后,socket等待来处理数据包
CLOSED socket没被使用
CLOSE_WAIT 远程主机是关闭状态的,等待socket关闭
LAST_ACK 远程端已关闭,套接字已关闭。等待确认
LISTEN 监听状态,等待远程主机连接
CLOSING 所有sockets都关闭状态,但还没有把所有数据发送出去
UNKNOWN 未知状态

(7)User
  socket所有者,或者程序所有者
(8)PID/Program name
  进程id或者程序名称(有可能要用root)

2、Active UNIX domain sockets (servers and established)/活动的Unix域套接字
(1)Proto
  套接字使用的协议(通常是unix)
(2)RefCnt
  使用数量(也就是通过此套接字连接的进程数)
(3)Flags
  显示的标志为SO_ACCEPTON(显示为ACC),SO_WAITDATA(W)或SO_NOSPACE(N)。如果相应的进程等待一个连接请求,那么SO_ACCECPTON用于未连接的套接字。其他标志通常并不重要。
(4)Type
类型分类:

类型 说明
SOCK_DGRAM 此套接字用于数据报(无连接)模式
SOCK_STREAM 流模式(连接)套接字
SOCK_RAW 此套接字用于RAW模式
SOCK_RDM 一种服务可靠性传递信息
SOCK_SEQPACKET 连续分组套接字
SOCK_PACKET RAW接口使用套接字
UNKNOWN 未知

(5)State
状态分类:

状态 说明
FREE 套接字未分配
LISTENING 套接字正在监听一个连接请求。除非设置–listening(-l)或者–all(-a)选项,否则不显示
CONNECTING 套接字正要建立连接
CONNECTED 套接字已连接
DISCONNECTING 套接字已断开
(empty) 套接字未连
UNKNOWN ! 不应当出现这种状态

(6)PID/Program name
处理此套接字的程序进程名和PID。
(7)Path
当相应进程连入套接字时显示路径名

(2)netstat -a
  禁止域名解析

[root@localhost /]# netstat -ltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN      1266/sshd           
tcp        0      0 0.0.0.0:simplifymedia   0.0.0.0:*               LISTEN      1558/java           
tcp        0      0 localhost:7992          0.0.0.0:*               LISTEN      1681/java           
tcp        0      0 localhost:7993          0.0.0.0:*               LISTEN      1681/java           
tcp        0      0 0.0.0.0:pushns          0.0.0.0:*               LISTEN      1700/java           
tcp        0      0 0.0.0.0:irdmi2          0.0.0.0:*               LISTEN      1700/java           
tcp        0      0 localhost:43107         0.0.0.0:*               LISTEN      1700/java           
tcp        0      0 localhost:mxi           0.0.0.0:*               LISTEN      13470/java          
tcp        0      0 localhost:45573         0.0.0.0:*               LISTEN      1700/java           
tcp        0      0 0.0.0.0:5701            0.0.0.0:*               LISTEN      1700/java           
tcp        0      0 localhost:8006          0.0.0.0:*               LISTEN      13503/java          
tcp        0      0 0.0.0.0:8009            0.0.0.0:*               LISTEN      13470/java          
tcp        0      0 0.0.0.0:8010            0.0.0.0:*               LISTEN      13503/java          
tcp        0      0 localhost:38286         0.0.0.0:*               LISTEN      1700/java           
tcp        0      0 0.0.0.0:webcache        0.0.0.0:*               LISTEN      13470/java          
tcp        0      0 0.0.0.0:http            0.0.0.0:*               LISTEN      8143/nginx: master  
tcp        0      0 0.0.0.0:tproxy          0.0.0.0:*               LISTEN      13503/java          
tcp        0      0 localhost:8017          0.0.0.0:*               LISTEN      1558/java           
tcp6       0      0 [::]:mysql              [::]:*                  LISTEN      1416/mysqld         
[root@localhost /]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1266/sshd           
tcp        0      0 0.0.0.0:8087            0.0.0.0:*               LISTEN      1558/java           
tcp        0      0 127.0.0.1:7992          0.0.0.0:*               LISTEN      1681/java           
tcp        0      0 127.0.0.1:7993          0.0.0.0:*               LISTEN      1681/java           
tcp        0      0 0.0.0.0:7997            0.0.0.0:*               LISTEN      1700/java           
tcp        0      0 0.0.0.0:7999            0.0.0.0:*               LISTEN      1700/java           
tcp        0      0 127.0.0.1:43107         0.0.0.0:*               LISTEN      1700/java           
tcp        0      0 127.0.0.1:8005          0.0.0.0:*               LISTEN      13470/java          
tcp        0      0 127.0.0.1:45573         0.0.0.0:*               LISTEN      1700/java           
tcp        0      0 0.0.0.0:5701            0.0.0.0:*               LISTEN      1700/java           
tcp        0      0 127.0.0.1:8006          0.0.0.0:*               LISTEN      13503/java          
tcp        0      0 0.0.0.0:8009            0.0.0.0:*               LISTEN      13470/java          
tcp        0      0 0.0.0.0:8010            0.0.0.0:*               LISTEN      13503/java          
tcp        0      0 127.0.0.1:38286         0.0.0.0:*               LISTEN      1700/java           
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      13470/java          
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      8143/nginx: master  
tcp        0      0 0.0.0.0:8081            0.0.0.0:*               LISTEN      13503/java          
tcp        0      0 127.0.0.1:8017          0.0.0.0:*               LISTEN      1558/java           
tcp6       0      0 :::3306                 :::*                    LISTEN      1416/mysqld         
[root@localhost /]# 

对比发现在local address即主机地址这一栏中,如果没有带n选项,会将套接字所对应的域名解析出来,如果加上n选项,那么就不会显示,即禁止域名解析的功能,这样做有助于提高查询速度,因为减少了对主机域名的查询。

学无止境,慢慢积累!

你可能感兴趣的:(Linux,linux)