在 Linux 系统当中:“触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的使用者与相关属性关系,给予这个 PID 一组有效的权限设置。
不同的 使用者身份执行这个 program 时,系统给予的权限也都不相同。
因为每个程序都有一个 PID ,那某个程序的父程序该如何判断?就通过 Parent PID (PPID) 来判断即可。
一、工作管理 (job control)
直接将指令丢到背景中“执行”的 &
将“目前”的工作丢到背景中“暂停”:[ctrl]-z
观察目前的背景工作状态: jobs
将背景工作拿到前景来处理:fg
让工作在背景下的状态变成运行中: bg
管理背景当中的工作: kill
语法格式:kill -signal %jobnumber
kill -l
选项与参数:
-l :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些?
signal :代表给予后面接的那个工作什么样的指示啰!用 man 7 signal 可知:
-1 :重新读取一次参数的配置文件 (类似 reload);
-2 :代表与由键盘输入 [ctrl]-c 同样的动作;
-9 :立刻强制删除一个工作;
-15:以正常的程序方式终止一项工作。与 -9 是不一样的。
nohup 可以让你在离线或登出系统后,还能够让工作继续进行
二、程序管理
1、程序的观察
- ps :将某个时间点的程序运行情况撷取下来
语法格式:ps aux <==观察系统所有的程序数据
ps -lA <==也是能够观察所有系统的数据
ps axjf <==连同部分程序树状态
选项与参数:
-A :所有的 process 均显示出来,与 -e 具有同样的效用;
-a :不与 terminal 有关的所有 process ;
-u :有效使用者 (effective user) 相关的 process ;
x :通常与 a 这个参数一起使用,可列出较完整信息。
输出格式规划:
l :较长、较详细的将该 PID 的的信息列出;
j :工作的格式 (jobs format)
-f :做一个更为完整的输出。
仅观察自己的 bash 相关程序: ps -l
F:代表这个程序旗标 (process flags),说明这个程序的总结权限,常见号码有:
若为 4 表示此程序的权限为 root ;
若为 1 则表示此子程序仅进行复制(fork)而没有实际执行(exec)。
S:代表这个程序的状态 (STAT),主要的状态有:
R (Running):该程序正在运行中;
S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>打印)
T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
Z (Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。
UID/PID/PPID:代表“此程序被该 UID 所拥有/程序的 PID 号码/此程序的父程序 PID 号码”
C:代表 CPU 使用率,单位为百分比;
PRI/NI:Priority/Nice 的缩写,代表此程序被 CPU 所执行的优先顺序,数值越小代表该程序越快被 CPU 执行。详细的 PRI 与 NI 将在下一小节说明。
ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该程序在内存的哪 个部分,如果是个 running 的程序,一般就会显示“ - ” / SZ 代表此程序用掉多少内存 / WCHAN 表示目前程序是否运行中,同样的, 若为 - 表示正在运行中。
TTY:登陆者的终端机位置,若为远端登陆则使用动态终端接口 (pts/n);
TIME:使用掉的 CPU 时间,注意,是此程序实际花费 CPU 运行的时间,而不是系统时 间;
CMD:就是 command 的缩写,造成此程序的触发程序之指令为何。
语法格式:top [-d 数字] | top [-bnp]
选项与参数:
-d :后面可以接秒数,就是整个程序画面更新的秒数。默认是 5 秒;
-b :以批次的方式执行 top ,还有更多的参数可以使用喔! 通常会搭配数据流重导向来将批次的结果输出成为文件。
-n :与 -b 搭配,意义是,需要进行几次 top 的输出结果。
-p :指定某些个 PID 来进行观察监测而已。
在 top 执行过程当中可以使用的按键指令:
? :显示在 top 当中可以输入的按键指令;
P :以 CPU 的使用资源排序显示;
M :以 Memory 的使用资源排序显示;
N :以 PID 来排序喔!
T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。
k :给予某个 PID 一个讯号 (signal)
r :给予某个 PID 重新制订一个 nice 值。
q :离开 top 软件的按键。
- pstree
语法格式:pstree [-A|U] [-up]
选项与参数:
-A :各程序树之间的连接以 ASCII 字符来连接;
-U :各程序树之间的连接以万国码的字符来连接。在某些终端接口下可能会有错误;
-p :并同时列出每个 process 的 PID;
-u :并同时列出每个 process 的所属帐号名称。
eg1:列出目前系统上面所有的程序树的相关性:
eg2:承上题,同时秀出 PID 与 users
2、程序的管理
程序是的互相管理其实是通过给予该程序一个讯号 (signal) 去告知该程序你想要让她作什么。
常见的讯号(signal)有:
代号 | 名称 | 内容 |
1 | SIGHUP | 启动被终止的程序,可让该 PID 重新读取自己的配置文件,类似重新启动. |
2 | SIGINT | 相当于用键盘输入 [ctrl]-c 来中断一个程序的进行 |
9 | SIGKILL | 代表强制中断一个程序的进行,如果该程序进行到一半, 那么尚未完成的部分可能会有“半产品”产生,类似 vim会有 .filename.swp 保留下来。 |
15 | SIGTERM | 以正常的结束程序来终止该程序。由于是正常的终止, 所以后续的动作会将他完成。不过,如果该程序已经发生问题,就是无法使用正常的方法终止时, 输入这个 signal 也是没有用的。 |
19 | SIGSTOP | 相当于用键盘输入 [ctrl]-z 来暂停一个程序的进行 |
- kill -signal PID
eg:以 ps 找出 rsyslogd 这个程序的 PID 后,再使用 kill 传送讯息,使得 rsyslogd 可以重 新读取配置文件。
- killall -signal 指令名称
语法格式:killall [-iIe] [command name]
选项与参数:
-i :interactive 的意思,互动式的,若需要删除时,会出现提示字符给使用者;
-e :exact 的意思,表示“后面接的 command name 要一致”,但整个完整的指令不能超过 15 个字符。
-I :指令名称(可能含参数)忽略大小写。
eg1:给予 rsyslogd 这个指令启动的 PID 一个 SIGHUP 的讯号
3、程序的执行顺序
- Priority 与 Nice 值
Linux 给予程序一个所谓的“优先执行顺序 (priority, PRI)”, 这个 PRI 值越低代表越优先的意思。不过这个 PRI 值是由核心动态调 整的, 使用者无法直接调整 PRI 值的。
由于 PRI 是核心动态调整的,我们使用者也无权去干涉 PRI !那如果你想要调整程序的优先 执行序时,就得要通过 Nice 值了。Nice 值就是上表的 NI,一般来说, PRI 与 NI 的相关 性如下:
PRI(new) = PRI(old) + nice
虽然 nice 值是可以影响 PRI ,不过, 最终的 PRI 仍是要经过系统分析后才会决定的。另外, nice 值是有正负的喔,而既然 PRI 越小越早被执行, 所以,当 nice 值为负值时,那么该程序就会降低 PRI 值,亦即会变的较优先被处理。此外,你必须要留意到:
- nice 值可调整的范围为 -20 ~ 19 ;
- root 可随意调整自己或他人程序的 Nice 值,且范围为 -20 ~ 19 ;
- 一般使用者仅可调整自己程序的 Nice 值,且范围仅为 0 ~ 19 (避免一般用户抢占系统资 源);
- 一般使用者仅可将 nice 值越调越高,例如本来 nice 为 5 ,则未来仅能调整到大于 5;
如何给予 某个程序 nice 值呢?有两种方式,分别是:
- 一开始执行程序就立即给予一个特定的 nice 值:用 nice 指令;
- 调整某个已经存在的 PID 的 nice 值:用 renice 指令。
- nice :新执行的指令即给予新的 nice 值
语法格式:nice [-n 数字] command
选项与参数:
-n :后面接一个数值,数值的范围 -20 ~ 19。
- renice :已存在程序的 nice 重新调整
语法格式:renice [number] PID
选项与参数: PID :某个程序的 ID !
eg1:找出自己的 bash PID ,并将该 PID 的 nice 调整到 -5
整个 nice 值是可以在父程序 --> 子程序 之间传递的。
4、观察系统资源
- free :观察内存使用情况
语法格式:free [-b|-k|-m|-g|-h] [-t] [-s N -c N]
选项与参数:
-b :直接输入 free 时,显示的单位是 KBytes,我们可以使用 b(Bytes), m(MBytes) k(KBytes), 及 g(GBytes) 来显示单位喔!也可以直接让系统自己指定单位 (-h)
-t :在输出的最终结果,显示实体内存与 swap 的总量。
-s :可以让系统每几秒钟输出一次,不间断的一直输出的意思!对于系统观察挺有效!
-c :与 -s 同时处理,让 free 列出几次的意思。
eg1:显示目前系统的内存容量
- uname:查阅系统与核心相关信息
语法格式:uname [-asrmpi]
选项与参数:
-a :所有系统相关的信息,包括下面的数据都会被列出来;
-s :系统核心名称
-r :核心的版本
-m :本系统的硬件名称,例如 i686 或 x86_64 等;
-p :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型!
-i :硬件的平台 (ix86)
eg1:输出系统的基本信息
- uptime:观察系统启动时间与工作负载
- netstat :追踪网络或插槽档
语法格式:netstat -[atunlp]
选项与参数:
-a :将目前系统上所有的连线、监听、Socket 数据都列出来
-t :列出 tcp 网络封包的数据
-u :列出 udp 网络封包的数据
-n :不以程序的服务名称,以埠号 (port number) 来显示;
-l :列出目前正在网络监听 (listen) 的服务;
-p :列出该网络服务的程序 PID
eg1:列出目前系统已经创建的网络连线与 unix socket 状态
eg2:找出目前系统上已在监听的网络连线及其 PID
- dmesg :分析核心产生的讯息
eg1:搜寻开机的时候,硬盘的相关信息为何?
- vmstat :侦测系统资源变化
语法格式:vmstat [-a] [延迟 [总计侦测次数]] <==CPU/内存等信息
vmstat [-fs] <==内存相关
vmstat [-S 单位] <==设置显示数据的单位
vmstat [-d] <==与磁盘有关
vmstat [-p 分区] <==与磁盘有关
选项与参数:
-a :使用 inactive/active(活跃与否) 取代 buffer/cache 的内存输出信息;
-f :开机到目前为止,系统复制 (fork) 的程序数;
-s :将一些事件 (开机至目前为止) 导致的内存变化情况列表说明;
-S :后面可以接单位,让显示的数据有单位。例如 K/M 取代 Bytes 的容量;
-d :列出磁盘的读写总量统计表
-p :后面列出分区,可显示该分区的读写总量统计表
eg1:统计目前主机 CPU 状态,每秒一次,共计三次!
eg2:系统上面所有的磁盘的读写状态
5、查询已打开文件或已执行程序打开之文件。
- fuser:借由文件(或文件系统)找出正在使用该文件的程序
语法格式:fuser [-umv] [-k [i] [-signal]] file/dir
选项与参数:
-u :除了程序的 PID 之外,同时列出该程序的拥有者;
-m :后面接的那个文件名会主动的上提到该文件系统的最顶层,对 umount 不成功很有效!
-v :可以列出每个文件与程序还有指令的完整相关性!
-k :找出使用该文件/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID;
-i :必须与 -k 配合,在删除 PID 之前会先询问使用者意愿!
-signal:例如 -1 -15 等等,若不加的话,默认是 SIGKILL (-9) !
eg1:找出目前所在目录的使用 PID/所属帐号/权限为何?
eg2::找到所有使用到 /home 这个文件系统的程序!
eg3:找到 /run 下面属于 FIFO 类型的文件,并且找出存取该文件的程序
- lsof :列出被程序所打开的文件文件名。
语法格式:lsof [-aUu] [+d]
选项与参数:
-a :多项数据需要“同时成立”才显示出结果时!
-U :仅列出 Unix like 系统的 socket 文件类型;
-u :后面接 username,列出该使用者相关程序所打开的文件;
+d :后面接目录,亦即找出某个目录下面已经被打开的文件!
eg1:请列出目前系统上面所有的被启动的周边设备
eg2:属于 root 的 bash 这支程序所打开的文件
- pidof :找出某支正在执行的程序的 PID
语法格式:pidof [-sx] program_name
选项与参数:
-s :仅列出一个 PID 而不列出所有的 PID
-x :同时列出该 program name 可能的 PPID 那个程序的 PID
三、SELinux 核心模块
1、SELinux 三种模式的启动、关闭与观察
- enforcing:强制模式,代表 SELinux 运行中,且已经正确的开始限制 domain/type 了;
- permissive:宽容模式:代表 SELinux 运行中,不过仅会有警告讯息并不会实际限制 domain/type 的存取。这种模式可以运来作为 SELinux 的 debug 之用;
- disabled:关闭,SELinux 并没有实际运行。
eg1:列出目前的 SELinux 使用哪个政策 (Policy)。
- SELinux 的启动与关闭
让 SELinux 模式在 enforcing 与 permissive 之间切换的方法为:
语法格式:setenforce [0|1]
选项与参数:
0 :转成 permissive 宽容模式;
1 :转成 Enforcing 强制模式
eg1:将 SELinux 在 Enforcing 与 permissive 之间切换与观察
2、SELinux 政策内的规则管理。
- SELinux 各个规则的布林值查询 getsebool
语法格式:getsebool [-a] [规则的名称]
选项与参数:
-a :列出目前系统上面的所有 SELinux 规则的布林值为打开或关闭值
eg1:查询本系统内所有的布林值设置状况
- SELinux 各个规则规范的主体程序能够读取的文件 SELinux type 查询 seinfo, sesearch
安装好我们所需要的软件后,我们就可以来使用 seinfo, sesearch 等指令了
语法格式:seinfo [-Atrub]
选项与参数:
-A :列出 SELinux 的状态、规则布林值、身份识别、角色、类别等所有信息
-u :列出 SELinux 的所有身份识别 (user) 种类
-r :列出 SELinux 的所有角色 (role) 种类
-t :列出 SELinux 的所有类别 (type) 种类
-b :列出所有规则的种类 (布林值)
eg1:列出 SELinux 在此政策下的统计状态
语法格式:sesearch [-A] [-s 主体类别] [-t 目标类别] [-b 布林值]
选项与参数:
-A :列出后面数据中,允许“读取或放行”的相关数据
-t :后面还要接类别,例如 -t httpd_t
-b :后面还要接SELinux的规则,例如 -b httpd_enable_ftp_server
eg1:找出 crond_t 这个主体程序能够读取的文件 SELinux type
eg2:找出 crond_t 是否能够读取 /etc/cron.d/checktime 这个我们自订的配置文件
eg3:列出 httpd_enable_homedirs 这个规则当中,主体程序能够读取的文件 SELinux type。
- 修改 SELinux 规则的布林值 setsebool
语法格式:setsebool [-P] “规则名称” [0|1]
选项与参数:
-P :直接将设置值写入配置文件,该设置数据未来会生效的!
eg1:查询 httpd_enable_homedirs 这个规则的状态,并且修改这个规则成为不同的布林值。
3、SELinux 安全本文的修改。
- 使用 chcon 手动修改文件的 SELinux type
语法格式:chcon [-R] [-t type] [-u user] [-r role] 文件
chcon [-R] --reference=范例档 文件
选项与参数:
-R :连同该目录下的次目录也同时修改;
-t :后面接安全性本文的类型字段!例如 httpd_sys_content_t ;
-u :后面接身份识别,例如 system_u; (不重要)
-r :后面街角色,例如 system_r; (不重要)
-v :若有变化成功,请将变动的结果列出来
--reference=范例档:拿某个文件当范例来修改后续接的文件的类型!
eg1:查询一下 /etc/hosts 的 SELinux type,并将该类型套用到 /etc/cron.d/checktime 上
eg2:直接以 /etc/shadow SELinux type 套用到 /etc/cron.d/checktime 上!
- 使用 restorecon 让文件恢复正确的 SELinux type
语法格式:restorecon [-Rv] 文件或目录
选项与参数:
-R :连同次目录一起修改;
-v :将过程显示到屏幕上
eg3:将 /etc/cron.d/ 下面的文件通通恢复成默认的 SELinux type!
eg4:重新启动 crond 看看有没有正确启动 checktime 啰
- semanage 默认目录的安全性本文查询与修改
语法格式:semanage {login|user|port|interface|fcontext|translation} -l
semanage fcontext -{a|d|m} [-frst] file_spec
选项与参数:
fcontext :主要用在安全性本文方面的用途, -l 为查询的意思;
-a :增加的意思,你可以增加一些目录的默认安全性本文类型设置;
-m :修改的意思;
-d :删除的意思。
eg1:查询一下 /etc /etc/cron.d 的默认 SELinux type 为何?
4、一个网络服务案例及登录文件协助
- setroubleshoot --> 错误讯息写入 /var/log/messages
- 实例状况说明:通过 vsftpd 这个 FTP 服务器来存取系统上的文件
- 匿名者无法下载的问题
这个例子在告诉你,要先从权限的角度来瞧一瞧,如果无法被读取,可能就是因为没有 r 或没有 rx!
- 无法从主文件夹下载文件的问题分析与解决
- 一般帐号用户从非正规目录上传/下载文件
- 无法变更 FTP 连线端口问题分析与解决