日常我们查看服务,进程,端口,路径等等都可以用到这两个命令,因为我记得也不够详细,这里为了提升自己运用能力,特写此文章。
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这个命令行工具的指令,用于显示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选项,那么就不会显示,即禁止域名解析的功能,这样做有助于提高查询速度,因为减少了对主机域名的查询。
学无止境,慢慢积累!