Linux 程序管理与 SELinux
整理进程管理、服务控制、SELinux 模式与安全上下文配置。
fork and exec
Linux创建子进程分为两步,fork和exec;当父进程想要创建一个子进程时,系统会先fork一个和父进程一模一样的暂存进程,这个暂存进程和父进程的区别在于,PID不同,PPID指向父进程。然后暂存进程开始以exec的方式加载实际要执行的子进程。
总之,Linux中创建子进程不是创建一个全新的进程,而是在被复制的父进程基础上执行新的程序。

工作管理
虽然Linux是多人多工的系统,但由于可以限制每个账户的最大连接数,可能会出现某个用户只能登录一个终端页面的情况,这种情况下要执行多道程序,需要使用到bash的工作管理功能(job control)。
要进行 bash 的 job control 必须要注意一些限制:
- job control只能管理来自当前shell的子进程(只能管理自己的bash)
- 你可以控制下达命令和执行指令的环境称为前景
背景执行
利用在命令后面加&的方式可以将命令丢到后台去执行。

这里的1438209是运行任务的pid,完成后会返回done作为提醒,可以通过这种方式在单shell场景下运行多个任务。
也可以通过ctrl+z把当前bash中运行的任务丢到背景中暂停。
jobs指令
可以通过jobs指令查看在背景中运行的任务
jobs [-lrs]
- -l : 同时列出PID
- -r:仅列出正在背景运行的任务
- -s:仅列出在背景暂停的任务
fg命令
用于切换背景任务
fg %jobnumber
将jobnumber的背景任务切换到前台执行
bg命令
将背景中暂停的任务状态转为运行
bg %jobnumber
将暂停在背景中工作号为jobnumber的任务状态转换为运行
kill命令
用于管理背景中的任务
kill -l
以上命令可以列出有哪些可以使用的信号,通常有以下这些:
HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS
有以下常用信号:
-1 :重载任务
-2 :表示和[ctrl]-c同样的动作;
-9 :强制结束一个任务;
-15:正常方式结束一个任务。
更纤细的信号相关的信息可以通过man 7 signal查询
kill命令后面可以跟%工作id或者PID
离线管理
通过&添加的背景任务是和bash绑定的,也就是说,若我们在远程连接的状况下,在背景执行了长任务,若断开了连接,那么任务也会结束。
这种情况下需要使用nohup将任务放到终端机中运行。
nohub [相关指令] // 在终端机前台中运行指令
nohub [相关指令] & // 在终端机后台中运行指令
程序管理
查看运行的程序
可以通过ps、top、pstree等命令查询程序的运行状态。
ps命令:
ps -l // 查阅自己的bash程序
ps aux // 查阅系统所有的程序
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1951986 1951925 0 80 0 - 3611 sigsus pts/0 00:00:01 zsh
4 R 0 1955931 1951986 0 80 0 - 2202 - pts/0 00:00:00 ps
可以查看到以下结构:
- F:程序标志,代表这个程序的总权限,常见的有4:root权限,1:表示子程序仅fork未exec
- S:程序状态,主要有R:运行中,S:睡眠中,D:不可被唤醒(等待I/O),T:停止状态,Z:僵尸程序,已经终止但是没有移出内存
- UID:拥有此程序的用户id
- PID:程序的PID
- PPID:父程序的PID
- C:代表CPU使用率,单位为百分比
- PRI/NI:代表此程序被CPU所执行的优先级,数值越小代表程序越快被CPU执行
- ADDR/SZ/WCHAN:内存相关参数
- TTY:登录者的终端位置,若为远程登录则使用动态终端接口(pts/n)
- TIME:使用掉的CPU时间
- CMD:触发程序
top命令动态查看
top [-d 秒数] | top [-bnp]
- -d:后跟时间表示更新时间
- -p:仅观察对应pid的程序
也可以通过其他两个参数将top的结果作为文档输出
top -b -n 2 > top.txt
top运行中按下P即可把程序按CPU使用率排序显示。