1 什么是程序
程序文件:通常以二进制文件的形式存放在储存介质中
程序与权限:程序被执行时,执行者的权限与属性,程序的代码,(二进制文件内容)等数据会被操作系统加载到内存中, 操作系统给予这个内存中的单元一个标识符(PID)。
子程序与父程序:登录系统后会取得一个shell,例如bash程序。在这个bash中启动另一个bash,新启动的bash即是原来bash 的子程序,原来的bash是新bash的父程序。可以通过Parent PID(PPID)得知一个程序的父程序。
例子:
第一次输入ps -l,发现两个程序,第一个bash是我们正在使用的shell,PID为7538,第二个为ps,是我们刚刚在这个 shell中启动的程序,可以看到ps的PPID是7538,即其父程序PID为7538。 第二个命令启动了另一个bash,可以看到此bash的PID为7599。其PPID为7538,即正在使用的shell的PID 第三个命令启动了ps程序,可以看到这个ps程序的PPID为7599,即其父程序为刚刚启动的bash。
fork and exec 程序的启动过程:
先由父程序fork一个一模一样的子程序,此子程序再以exec的方式执行真正要执行的程序。
常驻内存的程序: 平时执行的命令,如ls,执行一次就完了,但是有些程序需要一直执行,比如检测程序,这些程序就 常驻在内存。
Linux的多人多任务环境 Linux可以供多人同时登录系统,并且互不干扰,每个人像是在独立地使用计算机。
Linux中默认提供了六个命令行终端和 一个图形终端:tty1~tty7。
其中tty7是图形终端。
Ubuntu中可以通过Ctrl+Alt+F1~F7切换这7个终端。
当一个终端中程序 死掉时,可以切换到其它终端,用ps -aux查看哪个程序出错,然后kill掉.
2 工作管理(job control)
将程序放入后台执行
为什么:
如果一个程序执行时间很长,在shell中执行它,就要等待它执行完以后才能输入下一个命令,Linux是多 任务的操作系统,这样一来,就变成了一个命令一个命令地执行,为了执行一个程序的同时可以继续使用终端,可以将 程序放入后台执行,这样一来就不影响终端在前台的使用。
怎么做:
可以在要执行的程序命令后加上 & 符号,例如:
注意:
后台执行的程序不能和用户交互,不能用ctrl+c中断。
在vim中输入Ctrl+Z可以将vim暂时调入后台,从而可在 前台执行命令,又不退出vim。
观察后台程序状态: jobs
将后台程序调入前台执行:fg %num # num是job的id号
将后台程序暂停与恢复执行
将程序停止或重启:kill
脱机时仍然执行:nohup
$ nohup ./foo.sh &
此时,即使你注销,系统仍然会执行foo.sh程序
3 程序管理
程序观察
F:程序权限
S:程序状态
R:运行态,S:睡眠态,可唤醒,D:不可唤醒的睡眠态,如等待I/O
T:停止态,Z:僵尸态,程序已经终止但无法被移出内存
UID:启动程序的用户的ID
PID:程序标识
PPID:父程序标识
C:cpu使用率
PRI/NI:与优先级有关
ADDR/SZ/WCHAN:与内存有关,ADDR:内存哪个部分,SZ:占用内存大小,WCHAN:运行状态,-表示正在运行
TTY:登录的终端位置
TIME:使用掉的CPU时间
CMD:使用的命令
ps aux:观察系统中所有运行的程序
VSZ:该程序占用的虚拟内存量
RSS:该程序占用的固定内存量
top:动态观察程序变化
Tasks: 193 total, 2 running, 189 sleeping, 1 stopped, 1 zombie
Cpu(s): 0.5%us, 1.8%sy, 0.0%ni, 97.6%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 3962820k total, 3283620k used, 679200k free, 400800k buffers
Swap: 3905532k total, 0k used, 3905532k free, 1915036k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9156 root 20 0 0 0 0 R 4 0.0 0:00.21 kworker/0:1
1900 minix007 20 0 247m 71m 32m S 3 1.8 15:53.01 compiz
1089 root 20 0 126m 65m 8904 S 1 1.7 7:30.94 Xorg
18 root 20 0 0 0 0 S 1 0.0 0:44.87 kworker/3:0
1969 minix007 20 0 113m 20m 10m S 0 0.5 1:06.10 unity-panel-ser
6651 minix007 20 0 268m 26m 8880 S 0 0.7 0:53.59 chrome
操作:按P按CPU使用率排序,按M按内存使用率排序,按r修改NI值,按h帮助,按q退出。
pstree:显示程序树,可以看到程序之间的关系。
程序管理
基本原理:可以通过发送给程序一个信号,告诉程序你想让它做什么。这些信号包括SIGNUP(重新启动), SIGINT(相当于ctrl+c)等等,可用man 7 signal查询详细信息。
基本方式
程序执行的优先级
priority(PRI):PRI越低表示越优先,由内核动态调整,用户无法改变
nice
PRI(new) = PRI(old) + nice,所以可以通过nice值调整PRI,但并不是修改后就能生效,系统还要去分析判断。
nice值设定方式
方式一:启动程序时,用 nice -n command 设定,n为nice值,范围-20~19
方式二:程序已经启动,用 renice [number] PID 设定
系统资源观察
free: 观察内存
uname: 查看系统和内核信息(eg: uname -a)
uptime: 观察系统启动时间和工作负载
netstat: 查看网络状态
dmesg:
查看内核产生的信息 开机时,内核会检测硬件信息,运行中,内核也会产生一些信息,这些信息被放在内存中一个受保护的区域,使用 dmesg可以得到这些信息。
vmstat:
侦测系统资源变化
4 特殊文件与程序
SUID/SGID/SBIT与程序权限的关系
passwd:为什么普通用户执行passwd时拥有了root权限?这是因为执行passwd时,会取得一个新的程序与PID,该PID 产生时通过SUID赋予这个程序相应权限。
/proc:内存中运行的程序都以文件或目录的形式存在于/proc目录下。
fuser:找出使用指定文件,文件系统,或目录的程序。例如使用umount时发现[device is busy],就可以使用fuser找出哪个程序在使用 文件系统。
lsof:找出程序使用的文件
pidof:找出正在执行的程序的PID
5 selinux初探
SELinux是什么:
Security Enhanced Linux,安全强化的Linux。
SELinux是在进行程序,档案等细部权限设定 依据的一个核心模块。