欢迎各位兄弟 发布技术文章
这里的技术是共享的
父进程没了,它的所有的子孙进程也都没
进程状态
父子关系
优先级
0-139:140个优先级 数字越小,优先级越高
100-139:用户可控制 (这种说法并不精确)
0-99:内核调整 (这种说法并不精确)(准确的讲,它是实时优先级,数字越大,优先级越高,(哎越说越糊涂了,暂时就不这样理解吧)(干脆统一来说,数字越小,优先级越高))
linux 2.6引入了一种机制,从2个中挑一个和从2000个中挑一个,所需要的时间一样
衡量计算机的算法面对不同长度的队列的时候,它的性能如何,有一种标准叫大O标准
O: 大O标准所展现出来的现象或者说结果,随着队列长度的变化(或者说从中挑一个的时间)确定下一个取值的时间跟队列长度的时间(或随着队列长度的变化时间)而变化的曲线,称为大O衡量标准中所面临的函数
下面几种衡量曲线
O(1) 无论队列多长,从中挑一个的时间是一样的
O(n) 随着队列的变长,从中挑选的时间就成线性增长 linux2.4就是成线性增长的
O(logn)
O(n^2)
O(2^n)
init: 1 (init的进程号永远为1) 其它进程都是init的子进程,孙进程
ps: process state (process show)
查看进程的相关信息的专用命令
SysV风格:- (选项加横线) System V (成熟版本是第五版 V 表示罗马数字5)
BSD风格: (选项没横线)
a: (all) 显示所有与终端有关的进程
u: (user) 显示与用户相关的信息吧
x: (exclude 排除) 显示所有与终端无关的进程
进程分为两类:
跟终端相关的进程,通过命令行输入的进程
跟终端无关的进程,内核启动后的自动启动的进程,没有登录用户它就启动了
进程状态:
D: (Uninterruptible sleep (usually IO))不可中断的睡眠
R: (Ready)运行或就绪
S: (Interruptible sleep)可中断的睡眠
T: (terminate stop)停止
Z: (zombie)僵死
<: (high-priority (not nice to other users))高优先级的进程
N: (low-priority (nice to other users))低优先级的进程
+: (is in the foreground process group) 前台进程组中的进程 (进程组,启动一个bash,bash底下可以运行很多进程,这些进程都属于同一个终端组的)(前台进程,就是从命令行输入的,与终端相关的进程)
l : (is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)) 多线程进程
s: (s is a session leader) 会话进程首进程 (领导进程)
ps
-elF: (一般用不到小l吧)
e: 表示所有进程 (entire) ,相当于-A (all)
l: long format
F: extra full format
-ef: -ef 与 -eF 差不多吧
-eF:-ef 与 -eF 差不多吧
ps -axo 表示把ax组合起来,指定显示哪些字段 -o表示要指定显示哪些字段
ps -o PROPERTY1,PROPERTY2
ps -o pid,comm,ni
# man ps
pstree 显示当前系统上的进程树
pgrep 以grep风格来指定只显示哪些进程 在当前系统中,找符合某种特性的进程
pidof 根据程序名称,查找其相关进程的当前正在运行的ID号 (正在运行的进程的id号,即PID)
top 在命令行下监控每一个进程
top:
有许多子命令
M: (memory)根据驻留内存大小进行排序 (默认是根据cpu百分比来进行排序的,不是整体的,而是当前这一轮刷新后(5秒钟)的百分比)
P:(cpu)根据CPU使用百分比进行排序 (当前时长)
T:(time)根据累计时间进行排序,谁占用的总共时间长
l:是否显示平均负载和启动时间 再按l切换
t:是否显示进程和CPU状态相关信息 再按t切换
m:是否显示内存相关信息 再按m切换
c: (complete command)是否显示完整的命令行信息 再按c切换
q:(quit)退出top
k: (kill)终止某个进程 输入k 然后再输进程号就可以杀死这个进程了
top 运行中可以通过 top 的内部命令对进程的显示方式进行控制。内部命令如下表:
你运行top后按大键盘1看看,可以显示每个cpu的使用率
s - 改变画面更新频率
l - 关闭或开启第一部分第一行 top 信息的表示
t - 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示
m - 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示
N - 以 PID 的大小的顺序排列表示进程列表
P - 以 CPU 占用率大小的顺序排列进程列表
M - 以内存占用率大小的顺序排列进程列表
h - 显示帮助
n - 设置在进程列表所显示进程的数量
q - 退出 top
s - 改变画面更新周期
top -d (-d : Delay time interval as: -d ss.tt )指定延时时长的,单位是秒 (默认是5秒刷新一次)(默认5秒)
top -b (batch)表示以批处理模式 (显示一屏,再显示一屏,再再显示一屏) (想看后面的进程就使用-b)
top -b -n # 表示批处理模式,只显示前几屏,然后退出
进程间通信 (IPC: inter Process Communication) 进程间通信
共享内存 (一个进程往内存里写数据,另一个进程去内存里读数据)
信号: Signal (一个进程向另一个进程发简短的信号)
Semaphore: 旗语 (一个进程向另一个进程打个手势)
重要的信号
kill 的信号 kill 这个命令默认就是发出的第15号信号
1:SIGHUP: 让一个进程不用重启,就可以重读其配置文件的,并让新的配置信息生效
2:SIGINT: (INTERRUPT) Ctrl + c:中断一个正在进行的进程
9:SIGKILL:杀死一个进程 (强行杀死)(如果有正在写文件的话,这个文件就报废了)
15:SIGTERM:终止一个进程 (一定要终止你,给你足够的时间释放文件和资源),默认信号
指定一个信号:
1) 信号号码 kill -1
2) 信号名称 kill -SIGKILL
3) 信号名称简写 kill -SIGKILL 可以简写成 kill -KILL
kill PID
killall COMMAND(进程名) 叫这个名字的进程通通会被杀死
它也能接受信号,且接受信号的方法也与kill一样
调整nice值
调整已经启动的进程的nice值
renice NI PID
调整未启动的进程的nice值
默认启动的时候,每个进程的nice值都为0 我们在启动时指定nice值:
nice -n NI COMMAND
这样子的话,当这个命令启动的时候,它的nice就是指定的了
前台作业:前台运行的进程 占据了命令提示符(占据了命令行终端)
后台作业:启动之后,释放命令提示符,后续的操作在后台完成(在系统上默默完成)
一个作业 ( job )可能包括多个进程,它是一个比较大的概念
前台-->后台:
Ctrl + z 把已经在前台的正在前台的作业送到后台去,并且停止运行
COMMAND & (命令后加与符号)让命令在后台执行 在命令启动的时候,直接送到后台去运行
bg (backGround的简写) 让后台的停止作业继续在后台运行
bg [[%]JOBID] 可省的,省的话表示带+号的那个作业 百分号是可省的,因为它不能操作进程,只能操作作业
jobs: 查看所有的作业(包括前台和后台的)(一般指的是后台的)
每个后台都有作业号,作业号不同于进程号
+: 有+(加号)表示下一次默认被操作的作业 (还没有操作)
-: 减号表示命令将第二个默认被操作的作业 (+号完成后,下面就要操作减号的了)
+号减少,-号就变成了+号,选下一个作业就变成了减号
fg:将后台的作业调回前台 (用法与bg一样)
fg [[%]JOBID] 百分号是可省的,因为它不能操作进程,只能操作作业
kill %JOBID 杀死作业号为JOBID的作业,此时 百分号不能省,假如省了,程序会把JOBID当作进程号
vmstat (virtual memory state): 系统状态查看命令 这个命令与top一样重要
uptime
/proc/meminfo 内存信息的
vmstat
free
kill
pkill (跟pgrep一样,它是找进程的,pkill就是杀死那个进程的)
bg
fg
linux 2.6 按队列的优先级排140个队
优先级高有两种特性:
1,获得更多的CPU运行时间 为0的10毫秒,为1的9毫秒,为2的8毫秒,每一级获得的时间长度不一样
2,更优先获得cpu运行的机会
用户能够调整的优先级 100-139
nice值:优雅的,友好的 (每一个进程都有nice值)
-20到19
分别对应于100到139
0 调整为 -5 ,优先级从120转换成了116 (115)
默认情况下,每一个进程的nice值都是0
0 调整为3,就是优先级降低了
nice 通常指的是调大nice值,把自己变大,这样自己的优先级就低了
普通用户只能调大自己的进程的nice值,把自己的优先级降低
管理员可以随便调
进程id,进程号
PID: process id
父进程 (除了init,每个进程都有父进程)
PPID: parent process id
init:是所有进程的父进程
[root@localhost ~]# ls /proc 这些数字目录,每一个目录对应一个进程
这里 1目录 表示pid为1的进程 这里 186目录 表示pid为186的进程
这些目录保存着与这个进程相关的属性信息
某些进程是不连续的
每一个进程,它的号码是唯一的,就算这个进程退出了,其它的进程也不会占用这个号码的
/proc 这个目录下其实里面并没有任何文件,
里面的文件是当前内核信息的映射,所以访问到的都是内核中的信息
[root@localhost ~]# ls /proc/14
这些看似是文件,其实不是,它很可能是内核中参数,参数名字就是文件的名字,参数被映射成了文件
所以说这个是伪文件系统,它根本就不是文件,映射后展现成了文件
[root@localhost 14]# cd /proc/1
[root@localhost 1]# cat cmdline
init [3][root@localhost 1]#
它表示发起(启动)进程为1号进程的命令是什么
[root@localhost 1]# ps a 与终端相关的进程
[root@localhost 1]# ps u 显示用户的信息 (ps 默认是显示终端的进程)
[root@localhost 1]# ps x 显示与终端无关的进程
[root@localhost 1]# ps au
[root@localhost 1]# ps xu
[root@localhost 1]# ps aux
[root@localhost 1]# man ps
[root@localhost 1]# ps a
[root@localhost 1]# ps x (有几个是与终端有关的)
[root@localhost 1]# ps ax
[root@localhost 1]# ps ax | head
PID 表示进程号
TTY ? 问号表示与终端无关
STAT 表示进程状态
TIME 表示时间,运行时长
COMMAND表示命令
[root@localhost 1]# ps aux | head
(aux 显示的信息更详细 u 主要是与 user有关的字段吧)
[root@localhost 1]# pstree
可以把会话session看作是一个连接 会话进程的领导者
(父进程结束了,它的所有子进程会同时结束)
[root@localhost ~]# ps aux | head
%CPU 就是此进程占cpu时间比,%MEM就是此进程占物理内存比
VSZ (virtual size)虚拟内存集 RSS ( resident size)常驻内存集
TTY 是哪个终端
STAT 状态
START 启动时间
TIME 运行时长 真正占据了cpu的时间,而不是挂钟(挂表)时长
COMMAND 哪个命令启动的进程(凡是加了中括号的进程,表示的是内核线程)
[root@localhost ~]# ps -e
[root@localhost ~]# ps -el
[root@localhost ~]# ps -elF
[root@localhost ~]# ps -e | head
[root@localhost ~]# ps -el | head
PRI (priority)优先级
NI (nice) nice 值
[root@localhost ~]# ps -elF | head
PSR (processor)正在运行在哪个cpu上
STIME 开始运行时间吧
TIME 运行时长吧
# ps -ef 与 ps -eF (大F与小f近似,差不多)
[root@localhost ~]# ps -eF | head
[root@localhost ~]# ps -ef | head
[root@localhost ~]# ps -elf | head
[root@localhost ~]# ps -o pid,comm,ni (显示的比较短,因为ps默认只显示前台进程,不显示后台的)
[root@localhost ~]# ps -axo pid,comm,ni
[root@localhost ~]# man ps (可以看看-o 能够显示的字段)
pid,ni,comm 等许多
[root@localhost ~]# ps aux | grep "grep"
[root@localhost ~]# ps aux | grep "bash"
# ps aux 是用的最多的组合
# ps -ef 也是用的最多的组合
[root@localhost ~]# man pgrep
pgrep -u root sshd 表示用户为root(以root用户为属主运行的) 包含sshd模式的进程
[root@localhost ~]# pgrep bash 它只显示进程号
[root@localhost ~]# pgrep -u root bash 表示用户为root (以root用户为属主运行的) 包含bash模式的进程
[root@localhost ~]# man pidof
[root@localhost ~]# pidof init
1
[root@localhost ~]#
[root@localhost ~]# ps aux
[root@localhost ~]# pidof sshd
[root@localhost ~]# pidof crond
[root@localhost ~]# pidof httpd
[root@localhost ~]# pidof vsftpd
[root@localhost ~]# top 每隔5秒刷新一次,监控系统性能的最好用的
命令之一
TIME 运行时长,表示真正的占据cpu的时长,而不是挂钟走过的时间
COMMAND 相关的进程名
当前时间(10点05分35秒) 运行时长(最近一次启动到此刻为止的时长,3小时53分)
1 user(登录的用户)
load average(平均负载) (1分钟 5分钟 15分钟)的平均值, cpu耗时平均长度
Tasks:127 toal(共有127个进程) 1个处于运行的状态 (其实能够处于运行状态的一般只有一个,除非是双核的,它可能有两个,单核的一个cpu,一般只有一个)
126个睡眠的,0个停止,0个僵尸
Cpu(s), Cpu(s)表示多个cpu进行平均 每个cpu负载情况 (如果是多个cpu的话,这里可能有多个)
按1键,可以展开显示第一个cpu
us (user space)表示用户空间,用户空间的用户进程所占据的百分比 占的时长
sy (system space)表示系统空间,内核空间的进程所占据的百分比 占的时长
ni (nice 值) 表示调整nice值影响的cpu比例 占的时长
id (idle 空闲的)空闲所占的百分比
wa (wait)等待I/O完成所占据的时间
hi (Hardware interrupt) 表示硬件中断所占据的时间
si (Software interrupt) 表示软件中断所占据的时间
st(Stole 悄悄的偷,悄悄的走 steal的过去式 ) 被偷走的时间,虚拟化场景中,cpu会被偷走
Mem buffers 显示的物理内存的
Swap cache 显示的物理内存的
PR priority 优先级 RT (real time)表示实时优先级
NI nice 值
PRI (priority)优先级
NI (nice) nice 值
VIRT 就是VSZ (virtual)虚拟内存集
RES 就是RSS (resident size) 常驻内存集
SHR (share memory) 共享内存大小 (是共享库吗)
S (state) 状态 S (sleep)表示睡眠,R (ready )表示运行或就绪
%CPU 占的cpu百分比
%MEM 占的内存百分比
按1,显示所有的cpu 再按1隐藏所有cpu
[root@localhost ~]# top -d 1 (刷新时长)
[root@localhost ~]# top -d 1 -b (显示一屏,再显示一屏,再再显示一屏)
[root@localhost ~]# top -d 1 -b -n 3 (显示前3屏,然后退出)
[root@localhost ~]# kill -l 显示所有可用的信号
[root@localhost ~]# man kill
[root@localhost ~]# ps aux | grep top 找TOP的PID
root 7648 0.2 0.0 12764 1124 pts/0 S+ 09:59 0:00 top
root 7655 0.0 0.0 61232 752 pts/1 S+ 10:00 0:00 grep top
[root@localhost ~]# kill 7648 杀死TOP的PID (kill杀死的时候,必须要跟上进程号,默认是第15个信号)
[root@localhost ~]#
[root@ebs-28766 ~]# ps aux | grep httpd 这么多httpd的进程
[root@ebs-28766 public_html]# killall httpd
[root@ebs-28766 public_html]# ps aux | grep httpd 现在没有httpd了
[root@ebs-28766 public_html]# service httpd restart 再重新启动一下吧
[root@ebs-28766 public_html]# service nginxd restart 再重新启动一下吧
[root@localhost ~]# ps axo pid,ni,comm
[root@localhost ~]# renice 3 4833
4833: old priority 0, new priority 3
[root@localhost ~]# ps axo pid,ni,comm
[root@localhost ~]# renice -3 4833 (调整为整-3,不是减3)
4833: old priority 3, new priority -3
[root@localhost ~]# ps axo pid,ni,comm
[root@localhost ~]# nice -n -3 useradd hbase
当这个命令useradd hbase执行的时候 它的nice值就是-3了
(我们其实要执行一个服务,(长时间执行的命令)),才能通过ps aux 看到效果
[root@localhost ~]# vim a.txt (vim 打开一个文件的时候 通过ctrl + z送到后台去,而且属于停止状态)(送到后台且停止运行)
[1]+ Stopped vim a.txt
[root@localhost ~]# fg (使用fg (ForeGround),可以把它调回前台来)
[root@localhost ~]# mkdir /tmp/etc
[root@localhost ~]# tar -jcf /tmp/etc/tar.bz2 /etc/* (压缩时要等好长时间)
tar: 从成员名中删除开头的“/”
tar: 从硬连接目标中删除开头的“/”
[root@localhost ~]# rm -f /tmp/etc/tar.bz2
[root@localhost ~]#
[root@localhost ~]# tar -jcf /tmp/etc/tar.bz2 /etc/* & (加个与符号 直接释放前台到后台执行)
[root@localhost ~]# tar: 从成员名中删除开头的“/”
[root@localhost ~]#
[root@localhost ~]# ps aux | grep tar (如果tar运行的时间足够长的话,能够看到tar命令正在执行)
[root@localhost ~]# tar -jcf /tmp/etc.tar.bz2 /etc/*
敲回车后 ctrl + z 就到了后台执行,(发送一个stopped信号给这个作业)但是后台处于stopped状态了
[root@localhost ~]# jobs 查看当前系统的所有作业
[1] Stopped vim a.txt
[2]- Stopped tar -jcf /tmp/etc.tar.bz2 /etc/*
[3]+ Stopped tar -jcf /tmp/etc.tar.bz2 /etc/*
[root@localhost ~]# bg (这里按ctrl + C 未执行)(不指定的话,就默认执行带+(加号)的那个)
或者 bg # (#表示作业号) (明确说明要调作哪个作业号)
[root@localhost ~]# bg 3
[3]+ tar -jcf /tmp/etc.tar.bz2 /etc/* &
[root@localhost ~]# ps aux | grep tar (可以发现tar在执行中)
[root@localhost ~]# jobs (没有了,说时后台作业运行完了)
[root@localhost ~]# vim a.txt
按住 ctrl + z 送到后台去 (送到后台且停止运行)
[root@localhost ~]# fg 调到前台执行
[root@localhost ~]# tar -jcf /tmp/etc.tar.bz2 /etc/*
tar: 从成员名中删除开头的“/”
[1]+ Stopped tar -jcf /tmp/etc.tar.bz2 /etc/*
[root@localhost ~]# jobs
[1]+ Stopped tar -jcf /tmp/etc.tar.bz2 /etc/*
[root@localhost ~]#
[root@localhost ~]# kill 1 (表示杀死进程号为1的进程,这里不能这么用)(此时ctrl + c 未执行)
[root@localhost ~]# kill %1 (此时杀死作业号为1的作业)
[root@localhost ~]# jobs
[1]+ 已终止 tar -jcf /tmp/etc.tar.bz2 /etc/*
[root@localhost ~]#
[root@localhost ~]# vmstat
procs (process) 跟进程相关的内容
r (ready 运行和就绪) 运行队列长度 b 阻塞队列长度
memory 跟内存相关的内存
swpd 交换内存大小,交换内存引用空间 free 空闲内存大小 buff 用于缓冲的 cache 用于缓存的
swap 跟swap相关的内存,这是显示动态的
si (swap in) 在观察时间窗口之内,从物理内存有多少放入swap so (swap out) 在观察时间窗口之内,从swap有多少放出到物理内存
io 跟输入输出相关的内存
bi (blocks in) 有多少磁盘块从硬盘中调入内存中 bo (blocks out) 有多少磁盘块从内存中调出同步到硬盘
system 进程,系统内存空间的相关内容
in interrupt 中断的进程的个数(vmstat 1 每1秒钟中断的个数)(vmstat 2 每2秒钟中断的个数,好像不对) cs context switch 上下文切换(进程切换)的次数(vmstat 1 每1秒钟切换的次数)(vmstat 2 每2秒钟切换的次数,好像不对)
cpu cpu的使用率
us(user space 用户空间占据的cpu百分比) sy (system space 系统空间(内核空间)占据的cpu百分比) id(idle 空闲) wa(wait io 等待io的时间 ) st(stole偷走的cpu时间)
[root@localhost ~]# vmstat 1 每隔1秒钟刷新一次观察动态效果
[root@localhost ~]# vmstat 2 每隔2秒钟刷新一次观察动态效果
[root@localhost ~]# vmstat 1 5 每隔1秒钟刷新一次观察动态效果,但只显示5次
[root@localhost ~]# uptime 跟top的第一行是一样的
当前时间 运行时长 多少个用户登录了 平均负载值
19:49:08 up 2 days, 13:00, 2 users, load average: 0.00, 0.00, 0.00
[root@localhost ~]#
[root@localhost ~]# cat /proc/cpuinfo
[root@localhost ~]# cat /proc/meminfo
[root@localhost ~]# cd /proc/1
[root@localhost 1]# ls
[root@localhost 1]# cat maps 当前这个进程占用的物理内存地址