什么是进程
Linux的多用户,多任务环境
多人环境
多系统行为
多重登录环境的7个基本终端窗口
详细资料可以查看/etc/inittab文件
特殊的程序管理行为
bash环境下的作业管理
cp file1 file2 & 表示复制文件1 为文件2 &表示在后台执行
多用户,多任务的系统资源分配
作业管理 & ctrl+z jobs fg bg kill
要进行bash的作业管理,必须要注意的限制有:
程序必须是shell的子进程
程序不能等待 terminal/shell的输入
直接将命令放到后台执行 &
前台:您可以控制的作业称作前台作业
后台:在内存可以自行运行的作业 ,您无法直接控制它。
后台执行的任务输出依然会输出到屏幕上,可以通过重定向到文件
将当前作业放到后台 暂停 ctrl+z
注意是暂停
观察当前后台作业状态jobs
选项:
-l 除了列出作业号之外同时列出PID
-r 仅列出正在后台运行的作业
-s 仅列出正在后台暂停的作业
将后台作业拿到前台fg
格式 fg %jobnumber 作业号%可省
将作业在后台运行bg
让ctrl+z暂停的任务后台运行
管理后台的任务kill
选项:
-l 列出当前kill能够使用的信号
signal 表示后面的作业什么指示
-1 重新读取一次参数设置文件
-2 表示由键盘输入 ctrl+c
-9 表示立刻强制删除作业
-15 以正常方式终止一项作业
进程管理
进程的观察
ps 查看系统上正在运行的进程
选项:
-A 所有的进程均显示出来,与-e效果相同
-a 与终端无关的所有进程
-u 有效用户的相关进程
x 列出较完整的信息
输出格式:
l 较长,较详细的显示PID的信息
j 作业的格式
-f 更完整的输出
相关信息的含义:
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 2748 2741 0 80 0 - 2181 wait pts/2 00:00:01 bash
0 R 1000 5650 2748 0 80 0 - 1615 - pts/2 00:00:00 ps
F 表示这个进程的标志(flag) 4表示用户为超级用户
S 表示这个进程的状态
PID 进程ID PPID父进程ID
C CPU占用的资源百分比
PRI priority 优先级的缩写
NI Nice值
ADDR 核心功能,指出该进程在内存的哪一部分,运行的进程一般为-
SZ 用掉的内存大小
WCHAN 当前进程是否正在运行,-表示正在运行
TTY 登陆者的终端位置
TIME 用掉的CPU时间
CMD 所执行的命令
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 4580 2536 ? Ss Nov11 0:03 /sbin/init
root 2 0.0 0.0 0 0 ? S Nov11 0:00 [kthreadd]
USER 该进程属于哪个用户账号
PID 该进程的号码
%CPU 该进程使用的cpu资源百分比
%MEM 该进程所占用的物理内存百分比
VSZ 该进程所使用的虚拟内存量(KB)
RSS 该进程所占用的固定内存量(KB)
TTY 该进程是在哪个终端上运行的,与终端无关会显示?
STAT 该进程当前状态
R 运行
S 休眠
T 检测或停止
Z 僵尸
Ssl
S<
R+
Ss
SN
START 该进程所触发启动的时间
TIME 该进程实际所使用CPU的时间
COMMAND 该进程的实际命令
当发现大量僵尸进程的时候应该检查系统和父进程,不要盲目的kill
top [-d] | top [-bnp]
选项:
-d 后面可以接秒数,就是整个进程画面更新的秒数,默认是5秒
-b 以批处理的方式执行top 通常会搭配数据流重定向,结果输出到文件
-n 与-b搭配 意义是:要进行几次top输出
-p 指定每个PID进行检测
按键:
? 显示top中可以使用的按键
P 按CPU使用资源排序
M 按内存使用排序
N 按PID排序
T 按该进程使用的CPU累积(time+)排序
k 给某个PID一个信号
r 给某个PID重新确定一个值
pstree
选项:
-A 各进程之间的ASCII字符来连接
-p 同时列出各个进程的PID
-u 同时列出各个进程所属各个账号的名称
进程的删除
代号 名称 内容
1 SIGHUP 类似重新启动
2 SIGINT ctrl+c
9 SIGKILL 强制中断一个程序的执行
15 SIGTERM 正常结束进程
kill后面直接加数字和加上%是不同的
killall
选项:
-i interactive的意思,交互式的,提示
-e exact 表示后面接的command name一致 但整个完整命令不能超过15字符
-I 命令名称可以忽略大小写
系统资源的观察
free [-b|-k|-m|-g] [-t]
选项:
-b 直接输入free时 显示的单位是KB,可以通过几个参数设置单位
-t 在输出的最终结果显示物理内存和虚拟内存的总量
uname [-asrmpi]
选项:
-a 所有系统相关的信息
-s 系统核心的名称
-r 核心的版本
-m 本系统的硬件名称
-p cpu类型
-i 硬件的平台
uptime 显示当前系统已经开机的时间
netstat [-atunlp]
选项:
-a 将当前系统上所有的联机,监听,socket数据列出来
-t 列出tcp网络包的数据
-u 列出udp网络报的数据
-n 不以进程的服务名称,以端口号来显示
-l 列出当前正在网络监听的服务
-p 列出该网络服务的进程PID
含义:
Proto 网络的包协议
Recv-Q 非由用户进程连接到此socket的复制的总字节数
Send-Q 非由远程主机传送过来的应答的总字节数
Local Address 本地端的 IP
Foreign Address 远程主机的IP
State 联机状态
dmesg 输出所有的核心开机时的信息
sar 检测主机的资源状态,然后绘制图表
选项:
-u 进行cpu资源的统计
-r 进行主存储器当前状态的分析
进程的执行顺序
在ps -l中
PRI值越小表示优先级越高 PRI值是由系统动态产生的,不是固定值
nice值是我们提供的
PRI(new) = PRI(OLD) +nice
一般用户的nice为0-19
root 的为 -20-19
一般用户仅可以将nice值调高,且仅能调整属于自己的进程
调整nice的方法:
开始执行的时候就提供一个特定的nice 用nice命令
调整已经在执行的程序用renice
nice
nice [-n] command
选项:
-n 后面接一个值,-20-19
renice
renice [number] command
参数:
PID 某个进程的ID
特殊文件与进程
/proc/*的意义
内存中的数据都写入到proc目录中
/proc/*/cmdline 启动这个进程的命令串
/proc/*/environ 启动这个进程的环境变量的内容
/proc/cmdline 加载kernel执行的相关参数
/proc/cpuinfo 本机CPU的相关信息,包括频率,类型,运算功能等
/proc/devices 记录了系统各个设备的代号
/proc/filessystem 记录了当前系统已经加载的
/proc/interrupts 当前系统上的IRQ分配状态
/proc/ioports 当前系统上各台设备所配置的io地址
/proc/kcore 内存大小 不要读它
/proc/loadavg top和uptime里的三个平均数都来自这个文件
/proc/meminfo 使用free列出的内存信息都可以在这里查到
/proc/modules 列出linux当前已经加载的模块列表
/proc/mounts 系统已经载入的数据,就是用mount命令调出来的
/proc/swaps 记录使用的分区
/proc/partitions 使用fdisk -l会显示当前所有的分区,在这个文件中记录
/proc/pci 在pci总线上每台设备的详细情况
/proc/uptime 用uptime会出现的信息
/proc/version 核心的版本信息
/proc/bus/* 一些总线的配置
查询一打开的文件或已执行进程打开的文件
fuser [-ki] [-signal] file/dir
选项:
-k 找出使用该文件、目录的PID 并试图将signal发送给该进程
-i 必须与-k配合 在删除PID前会给出提示信息
-signal 如果不添加,默认是9号信号(SIGKILL)
duxing@ubuntu:/tmp$ fuser .
/tmp: 2748c
其中c的含义:
c 在当前目录下
e 可以执行
f 一个打开的文件
r 表示根目录
通过一个进程查询打开的文件
lsof [-Uu] [+d]
选项:
-a 需要多项数据 同时成立 才显示出结果的情况
-U 仅列出类UNIX 系统的socket文件类型
-u 后面接用户名 列出该用户相关进程所打开的文件
+d 后面接目录,即找出某个目录下已经打开的文件
pidof
选项:
-s 仅列出一个PID而不列出所有PID
-x 同时列出该程序名可能的PPID进程的PID
启动流程
加载BOIS的硬件信息并获取第一个启动设备的代号
读取第一个启动设备的MBR的引导加载程序的启动信息
加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有硬件
核心文件一般解压到/boot 取名为/boot/vmlinuz
核心执行init 并获取运行信息
init执行/etc/rc.d/rc.sysinit文件
启动核心的外挂模块(/etc/modprobe.conf)
init执行运行的各个批处理文件
init执行/etc/rc.d/rc.local文件
执行bin/login 等待用户登录
登录之后用shell控制主机
第一个程序init及设置文件/etc/inittab runlevel
6个运行等级
0-halt 系统直接关机
1-single user mode 单用户维护模式,用于系统出问题时进行维护
2-Multi-user,without NFS 类似等级3但是无NFS服务
3-Full multi-user mode 完整的含有网络功能的纯文本模式
4-unused 系统保留
5-X11 与3相同,只不过使用 X Winodw
6-reboot 重新启动
等级是从inittab文件中设置的
文件语法:
[设置项目]:[run level]:[init的操作行为]:[命令项目]
设置项目:
最多设置4个字符,表示init的主要工作项目,只是一个简单的表示
运行等级:
该项目在那些等级下执行 35 表示会在3 和5等级下执行
init的操作行为:
initdefalut 表示默认的运行等级设置值
sysyinit 表示系统初始化的操作项目
ctrlaltdel 表示后面接[ctrl]+[alt]+[del]三个键是否可以重新启动
wait 后面可以接的命令项目必须要执行完毕才能继续随后的操作
respawn 后面接的init仍会主动重新启动
命令项目:
即应该可以执行的命令,通常是一些脚本
init处理系统初始化流程 (/etc/rc.d/rc.sysinit)
/etc/rc.d/rc.sysinit 的主要工作:
获取网络环境与主机类型
测试与载入内存设备/proc及USB设备/sy
决定是否启动SELinux
接口设备的检测与即插即用(PnP)苍蝇的测试
用户自定义模块的加载
加载核心的相关设置
设置系统时间
设置终端控制台
设置RAID与LVM等硬盘功能
以fsck检测磁盘文件系统
进行磁盘配额quota的交换(非必要)
重新以可读取模式载入系统磁盘
启动quota功能
启动系统随机数设备
清除启动过程中的临时文件
将启动相关信息加载到/var/log/dmesg文件中
/etc/rc.d/init.d/* 其中*以S开头表示启动时需要的服务,k开头表示关机
需要的服务 S K后面接的数字表示该文件的执行顺序
用户自定义引导启动程序
想要在启动时就执行的工作,可以将shell文件存在/etc/rc.d/rc.local 启动时
就会执行
根据/etc/inittab 设置加载终端或X-Winodw界面
变换运行等级
可以通过修改/etc/inittab来修改 (永久修改)
init N (临时修改)
可以通过runlevel查看当前等级
核心与核心模块
核心一般都是与压缩文件,需要解压缩后才能加载到主存储器
核心与核心模块放在哪?
核心 /boot/vmlinuz 或 /boot/vmlinuz-version
核心解压缩所需的RAM disk /boot/initrd
核心模块 /lib/modules/version/kernel
核心源码 /usr/src/linux(安装才有)
核心模块与依赖性
通常核心模块放在/lib/modules/`uname -r`/kernel
arch 与硬件平台相关的项目,如cpu等级
crypto 核心所支持的加密技术 如md5 des
drivers 一些硬件的驱动程序,如显示卡网卡
fs 核心所支持的文件系统
lib 一些函数库
mm
net 与网络有关的各项协议数据,还有防火墙模块
sound 与音效有关的各模块
/lib/modules/`uname -r`/modules.dep 记录了核心支持模块的依赖性
可以用depmod命令建立该文件
depmod
选项:
-A 不加任何参数,depmod会主动 分析当前核心的模块,并写入
/lib/modules/`uname -r`/modules.dep 加-A只会搜索更新的
-n 不写入/lib/modules/`uname -r`/modules.dep 只是将结果输出到屏幕
-e 显示出当前已加载的不可执行的模块名称
核心模块的观察lsmod、modinfo
lsmod 查看核心加载了多少模块
modinfo [-adln] [module_name|filename]
选项:
-a 仅列出作者名称
-d 仅列出该模块的说明(description)
-l 仅列出授权(license)
-n 列出该模块的详细路径
核心模块的加载与删除insmod、modprobe、rmmod
modprobe 会主动分析模块之间的联系
选项:
-c 列出当前系统所有的模块
-l 列出当前在/lib/modules/`uname -r`/kernel中的所有模块文件名
-f 强制加载该模块
-r 类似rmmmod 删除某个模块
insmod 完全由用户自行加载一个完整文件名的模块,不会主动分析依赖性
rmmod 删除一个模块
选项:
-f 强制删除,不管是否在使用
-w 若该模块在使用就等结束以后再删除