Linux 内核:抢占式多任务
守护进程: daemon, 在系统引导过程中启动的进程, 和 终端无
关进程
前台进程:跟终端相关,通过终端启动的进程
注意:两者可相互转化
==僵尸进程将会导致资源浪费,而孤儿则不会。==
CPU-Bound :CPU 密集型,非交互
IO-Bound :IO 密集型,交互
pstree, ps, pidof,pgrep, top, htop, glance, pmap, vmstat, dstat,kill,pkill, job, bg, fg, nohup
pstree [-a] [-c] [-h|-Hpid] [-l] [-n] [-p] [-u] [-Z] [-A|-G|-U][pid|user]
|参数|说明|
|—|—|
-a | 显示出该命令的参数, 假如这个命令进程被其他进程替换掉, 那么进程将显示在括号中 -a 选项包含有压实进程树的选项, 对于相同的进程, 会使用n*(process)的形式展显出来。
-c | 关闭禁用显示结果进程树,在默认情况下,进程子树是会被压缩的。不管有多少进程名相同的进程,都会逐个显示出来。
-G | 使用vt100线性描述树
-h | 突空出显示当前进程的父进程并高亮显示出来,如果没有父进程那么什么都不会显示。
-H | 突出显示出指定进程的父进程信息并高亮显示出来,使用方法为 pstree -H PID
-l | 显示长格式命令选项,在默认的情况下,命令行最多显示宽度为132bit ,超过将不能正常显示。
-n | 基于进程相同的祖先来进行排序,可以命名pid来代替进程名称 。
-p | 显示所有的时程,显示结果包含进程名和时进程ID
-u | 显示出用户的UID,无论何时,这个UID和进程比较UID参数,这个新的UID将在进程名后显示不同的参数。
-U | 使用utf-8字符集以十进制表示
pstree -pc
|参数|说明|
|—|—|
a |选项包括所有终端中的进程
x |选项包括不链接终端的进程
u |选项显示进程所有者的信息
f| 选项显示进程的父进程
o| 属性… 选项显示定制的信息:pid 、comm 、%cpu 、%mem 、state 、tty、euser 、ruser
|字段|含义|
|—|—|
VSZ| Virtual memory SiZe ,虚拟内存集,线性内存
RSS| ReSident Size, 常驻内存集
ni|nice值 值
pri|priority 优先级
psr|processor CPU 编号
rtprio|实时优先级
|字段|含义|
|—|—|
R|running
S|interruptable sleeping
D|uninterruptable sleeping
T|stopped
Z|zombie
+| 前台进程
l| 多线程进程
L|内存 分页并带锁
N |低优先级进程
<| 高优先级进程
s| session leader
-e: 显示所有进程
-f: 显示完整格式程序信息
- -eFH
-F: 显示更完整格式的进程信息
-H: 以进程层级格式显示进程相关信息
- eo
-eo pid,tid,class,rtprio,ni,pri,psr,
pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,
pid,pcpu,comm
- -axo
ps axo pid,cmd,psr,ni,pri,rtprio
静态优先级:100-139
进程默认启动时的nice 值为0 ,优先级为120
只有根用户才能降低nice 值(提高优先性)
nice -n -5 /usr/local/mysql/bin/mysqld_safe &
renice -n 2 -p 3432
-n后面是优先级的值;-p是进程号。
查看:
ps axo pid,comm,ni
pgrep [options] pattern
|参数|含义|
|—|—|
-u uid|effective user ,生效者
-U uid|real user ,真正发起运行命令者
-t terminal| 与指定终端相关的进程
-l| 显示进程名
-a| 显示完整格式的进程 名
-P pid| 显示指定进程的子进程
tty
pgrep -lt pts/0 显示pts/0终端的进程名和pid
pgrep -lu wang 显示王wang用户的相关进程
pidof bash
uptime
00:48:13 up 8:02, 2 users, load average: 0.00, 0.01, 0.05
00:48:13 up指开机时间
8:02指系统运行了8分零2秒
2 users表示当前有两个终端登录,至少有一个tty1
oad average: 0.00, 0.01, 0.05指1,5,10分钟内的平均负载
|参数|说明|
|—|—|
-b |批处理
-c| 显示完整的命令
-I |忽略失效过程
-s |保密模式
-S |累积模式
-i<时间> |设置间隔时间
-d <时间>|默认3s
-u<用户名>| 指定用户名
-p<进程号> |指定进程
-n<次数> |循环显示的次数
|字段|说明|
|—|—|
us |用户空间
sy |内核空间
ni |改变过优先级的进程占用CPU的百分比
id |空闲CPU百分比
wa |IO等待占用CPU的百分比
hi |硬中断 通过鼠标,硬盘数据移动等操作发送中断信号
si |软中断(模式切换)软件对cpu的操作,比如进程之间的切换
st|虚拟机偷走的时间
|字段|说明|
|—|—|
PID|进程id
USER|进程所有者
PR|进程优先级
NI|nice值。负值表示高优先级,正值表示低优先级
VIRT|进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES|进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR|共享内存大小,单位kb
S|进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU|上次更新到现在的CPU时间占用百分比
%MEM|进程使用的物理内存百分比
TIME+ | 进程使用的CPU时间总计,单位1/100秒
COMMAND|进程名称(命令名/命令行)
|参数|说明|
|—|—|
P|以占据的CPU 百分比,%CPU
M|占据内存百分比,%MEM
T|累积占据CPU 时长,TIME+
|说明|指令|
|—|—|
uptime 信息|l 命令
tasks 及cpu 信息|t 命令
cpu 分别显示|1 ( 数字)
memory 信息|m 命令
退出命令|q
修改刷新时间间隔|s
终止指定进程|k
保存文件|W
在top 命令执行过程中可以使用的一些交互命令。这些命令都是单字母的,如果在命令行中使用了s 选项, 其中一些命令可能会被屏蔽。
h |显示帮助画面,给出一些简短的命令总结说明
M |根据驻留内存大小进行排序
P |根据CPU使用百分比大小进行排序
T |根据时间/累计时间进行排序
k |终止一个进程。
i |忽略闲置和僵死进程。这是一个开关式命令。
q |退出程序
r |重新安排一个进程的优先级别
S |切换到累计模式
s |改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s
f或者F |从当前显示中添加或者删除项目
o或者O |改变显示项目的顺序
l |切换显示平均负载和启动时间信息
m |切换显示内存信息
t |切换显示进程和CPU状态信息
c |切换显示命令名称和完整命令行
W |将当前设置写入~/.toprc文件中
-多U多核CPU监控
在top基本视图中,按键盘数字“1”,可监控每个逻辑CPU的状况:
-高亮显示当前运行进程
敲击键盘“b”(打开/关闭加亮效果)
我们发现进程id为2570的“top”进程被加亮了,top进程就是视图第二行显示的唯一的运行态(runing)的那个进程,可以通过敲击“y”键关闭或打开运行态进程的加亮效果
- 敲击键盘“x”(打开/关闭排序列的加亮效果)
- 通过”shift + >”或”shift + <”可以向右或左改变排序列
[root@TG1704 log]# top
top - 14:06:23 up 70 days, 16:44, 2 users, load average: 1.25, 1.32, 1.35
Tasks: 206 total, 1 running, 205 sleeping, 0 stopped, 0 zombie
Cpu(s): 5.9%us, 3.4%sy, 0.0%ni, 90.4%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 32949016k total, 14411180k used, 18537836k free, 169884k buffers
Swap: 32764556k total, 0k used, 32764556k free, 3612636k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28894 root 22 0 1501m 405m 10m S 52.2 1.3 2534:16 java
18249 root 18 0 3201m 1.9g 11m S 35.9 6.0 569:39.41 java
2808 root 25 0 3333m 1.0g 11m S 24.3 3.1 526:51.85 java
25668 root 23 0 3180m 704m 11m S 14.0 2.2 360:44.53 java
574 root 25 0 3168m 611m 10m S 12.6 1.9 556:59.63 java
1599 root 20 0 3237m 1.9g 11m S 12.3 6.2 262:01.14 java
1008 root 21 0 3147m 842m 10m S 0.3 2.6 4:31.08 java
13823 root 23 0 3031m 2.1g 10m S 0.3 6.8 176:57.34 java
28218 root 15 0 12760 1168 808 R 0.3 0.0 0:01.43 top
29062 root 20 0 1241m 227m 10m S 0.3 0.7 2:07.32 java
1 root 15 0 10368 684 572 S 0.0 0.0 1:30.85 init
2 root RT -5 0 0 0 S 0.0 0.0 0:01.01 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
说明:
统计信息区:
前五行是当前系统情况整体的统计信息区。下面我们看每一行信息的具体意义。
第一行,任务队列信息,同 uptime 命令的执行结果,具体参数说明情况如下:
14:06:23 — 当前系统时间
up 70 days, 16:44 — 系统已经运行了70天16小时44分钟(在这期间系统没有重启过的吆!)
2 users — 当前有2个用户登录系统
load average: 1.15, 1.42, 1.44 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
第二行,Tasks — 任务(进程),具体信息说明如下:
系统现在共有206个进程,其中处于运行中的有1个,205个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有0个。
第三行,cpu状态信息,具体属性说明如下:
5.9%us — 用户空间占用CPU的百分比。
3.4% sy — 内核空间占用CPU的百分比。
0.0% ni — 改变过优先级的进程占用CPU的百分比
90.4% id — 空闲CPU百分比
0.0% wa — IO等待占用CPU的百分比
0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比
0.2% si — 软中断(Software Interrupts)占用CPU的百分比
备注:在这里CPU的使用比率和windows概念不同,需要理解linux系统用户空间和内核空间的相关知识!
第四行,内存状态,具体信息如下:
32949016k total — 物理内存总量(32GB)
14411180k used — 使用中的内存总量(14GB)
18537836k free — 空闲内存总量(18GB)
169884k buffers — 缓存的内存量 (169M)
第五行,swap交换分区信息,具体信息说明如下:
32764556k total — 交换区总量(32GB)
0k used — 使用的交换区总量(0K)
32764556k free — 空闲交换区总量(32GB)
3612636k cached — 缓冲的交换区总量(3.6GB)
备注:
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。
如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存:18537836k +169884k +3612636k = 22GB左右。
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
第六行,空行。
第七行以下:各进程(任务)的状态监控,项目列信息说明如下:
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)
==有shengbang声明的脚本执行时ps能显示脚本名,没有shengbang声明只显示命令==
|参数|说明|
|—|—|
-d #| 指定延迟时间;
-u UserName|仅显示指定用户的进程
-s COLUME|以指定字段进行排序
子命令:
s|跟踪选定进程的系统调用
l| 显示选定进程打开的文件列表
a |将选定的进程绑定至某指定CPU 核心
t|显示进程树
vmstat 2 5 每2s刷新一次刷新5次
-s: 显示内存的统计数据
swampon -s显示提供swamp的分区
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 1554412 42580 197048 0 0 53 3 174 951 0 2 98 0 0
us:Time spent running non-kernel code
sy: 内核空间时间花费
id: cpu空闲时间. Linux 2.5.41 前, 包括IO-wait time.
wa: IO等待时间. 2.5.41 前,包括in idle.
st: Time stolen from a virtual machine. 2.6.11 前, unknown
iostat 1 10 1s刷一次刷新10次停止
-x: 显示详细格式的信息
示例:pmap 1 显示init或systemd进程的内存映射
cat /proc/PID/maps
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P
password] [–password] [-t refresh] [-f file] [-o output]
a Sort processes automatically l Show/hide logs
c Sort processes by CPU% b Bytes or bits for network I/O
m Sort processes by MEM% w Delete warning logs
p Sort processes by name x Delete warning and critical logs
i Sort processes by I/O rate 1 Global CPU or per-CPU stats
d Show/hide disk I/O stats h Show/hide this help screen
f Show/hide file system stats t View network I/O as combination
n Show/hide network stats u View cumulative network I/O
s Show/hide sensors stats q Quit (Esc and Ctrl-C also work)
y Show/hide hddtemp stats
客户机A:172.16.252.134监控服务器B:172.16.253.182
B机器行执行:
glances -s -B 172.16.253.182
A机器执行:
glances -c 172.16.253.182(指定要监控的ip,即服务端ip)
glances -s -B IPADDR
IPADDR: 指明监听的本机哪个地址
glances -c IPADDR
IPADDR 要连入的服务器端地址
|参数|说明|
|—|—|
-c|显示cpu 相关信息-C #,#,…,total
-d|显示disk 相关信息-D total,sda,sdb,…
-g|显示page 相关统计数据
-m|显示memory 相关统计数据
-n|显示network 相关统计数据
-p|显示process 相关统计数据
-r|显示io 请求相关的统计数据
-s|显示swapped 相关的统计数据
–tcp|
–udp|
–unix|
–raw|
–socket|
–ipc|
–top-cpu|显示最占用CPU 的进程
–top-io|显示最占用io 的进程
-top-mem|显示最占用内存的进程
–top-latency|显示延迟最大的进程
向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG 开头(可省略 ),不 区分大小写
signal|complications
—|—
0)用于检查进程是否在执行
1) SIGHUP|无须关闭进程而让其重读配置文件
2) SIGINT|中止正在运行的进程;相当于Ctrl+c
3) SIGQUIT|相当于ctrl+(quit)
9) SIGKILL|强制杀死正在运行的进程
15) SIGTERM|终止正在运行的进程(正常终止,默认发15)
18) SIGCONT|继续运行
19) SIGSTOP|后台休眠
kill –n SIGNAL pid;kill –s SIGNAL pid
killall -9 bash
killall httpd
-SIGNAL
-u uid: effective user ,生效者
-U uid: real user ,真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l:显示进程 名(pgrep 可用)
-a:显示完整格式的进程名(pgrep 可用)
-P pid: 显示指定进程的子进程
pkill -lu wang 杀死王用户相关的进程
pkill -lt pts/0 杀死终端pts/0的进程
**后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭
后台作业。如果希望送往后台后,剥离与终端的关系可使用**
nohup COMMAND &
jobs 只能看到当前终端的进程
vi all.sh
f1.sh&
f2.sh&
f3.sh&
(f1.sh&);(f2.sh&);(f3.sh&)
{ f1.sh& f2.sh& f3.sh& }
#找到httpd的父进程
pstree -p |grep httpd
|-httpd(3226)-+-httpd(3231)
| |-httpd(3232)
| |-httpd(3233)
| |-httpd(3234)
| |-httpd(3235)
| |-httpd(3236)
| |-httpd(3237)
| `-httpd(3238)
[260][root@lee: conf]# vim httpd.conf
[261][root@lee: conf]# mkdir -p /home/www/test
[262][root@lee: conf]# echo 11111 > /home/www/test/index.html
# 发送1信号重载配置
[263][root@lee: conf]# kill -1 3226
[root@lee: boot]# pgrep -l ping
86735 ping
或者使用pidof查
[363][root@lee: boot]# pidof ping
86735
[364][root@lee: boot]# pkill ping
[365][root@lee: boot]# pgrep ping
#先改密码
passwd
#查看root身份登录的终端
[root@lee: boot]# w
18:52:56 up 21:15, 3 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 172.16.250.153 12:08 3:14 0.03s 0.03s -bash
root pts/1 172.16.250.153 11:22 6:45m 0.11s 0.11s -bash
root pts/2 172.16.250.153 12:58 0.00s 0.03s 0.00s w
#查看自己当前使用的终端
[368][root@lee: boot]# tty
/dev/pts/2
#强制下线其他终端
[root@lee: boot]# pkill -9 -t pts/1
[373][root@lee: boot]# pkill -9 -t pts/0
[374][root@lee: boot]# w
18:54:27 up 21:16, 1 user, load average: 0.05, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/2 172.16.250.153 12:58 0.00s 0.04s 0.00s w
pgrep sshd|xargs kill -0
pkill -9 -u hacker
#方法一:写在脚本里:
echo -e 'a.sh&\nb.sh&\nc.sh&' >> test.sh\
#方法二:
(a.sh&);(b.sh&);(c.sh&);
#方法三
{a.sh& b.sh& c.sh&}
echo 0 8 * * * root reboot >> /etc/cron.d/reboot
或者
echo 0 8 * * * reboot|contrab
ldd /bin/rpm
uptime
top
htop
iostat
vmstat
nohup COMMAND &
#screen;COMMAND
echo '*/10 1-5 * * 3 root /bin/backup.sh' >> /etc/cron.d/backup
或者
echo '*/10 1-5 * * 3 /bin/backup.sh' |contrab
lsof -i:80
kill -9 pid