学习目标:
Linux速成六、
学习内容:
1、程式与程序
2、观察程序的指令
3、程序的优先序 PRI 于 NI
4、bash 的工作管理
5、特殊权限 SUID/SGID/SBIT 的功能
6、job control 的管理
7、离线管理的问题
8、程序的管理
1、程式与程序
- 程式 (program):通常为 binary program ,放置在存储介质中 (如硬盘、光碟、磁帶等),为实体档案的型态存在;一个程式可以生成多个程序。
- 程序(process):程式被触发后,执行者的权限与属性、程式的程式码与所需资料等都会被载入内存中,作业系统并给予这个内存的单元一个识别码(PID),可以说,程序就是一个正在运作中的程式。
- 不同的使用者登入都是执行 /bin/bash 这个 shell,读者也应该知道系统管理需要管理员身份的 bash 才能够运作,一般账号的bash 能做的事情相对较少,但其实两者都是执行 bash 的
- 父程序与子程序 su 来切换身份成为 root,此时 su 会给予一个具有 root 权限的 bash 环境,那么使用者登入的 bash就被称为父程序,由 su - 取得后的 bash 就是子程序
2、观察程序的指令
- ps观察程序
- 选项与参数:
-A :所有的 process 均显示出來,与 -e 具有同样的效用;
-a :不与 terminal 有关的所有 process ;
-u :有效使用者 (effective user) 相关的 process ;
-x :通常与 a 这个参数一起使用,可列出较完整信息。 输出格式规则:
- -l :较长、较详细的将该 PID 的的信息列出
- -j :工作的格式 (jobs format)
- -f :做一个更为完整的输出
[root@192 ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.7 179100 13492 ? Ss 10月27 0:03 /usr/lib/systemd/systemd --switched-root --system --d
root 2 0.0 0.0 0 0 ? S 10月27 0:00 [kthreadd]
...
[root@192 ~]# ps -lA
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 44775 do_epo ? 00:00:03 systemd
1 S 0 2 0 0 80 0 - 0 - ? 00:00:00 kthreadd
...
[root@192 ~]# ps axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 2 0 0 ? -1 S 0 0:00 [kthreadd]
...
[root@192 ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 3325 3324 0 80 0 - 59082 - pts/0 00:00:00 bash
0 R 0 3358 3325 0 80 0 - 63798 - pts/0 00:00:00 ps
- F (flag):代表程序的总结旗标,常见为4 代表 root
- 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 执行。
- ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该程序在内存的哪个部分,如果是个 running 的程序,一般就会显示- / SZ 代表此程序用掉多少内存 / WCHAN 表示目前程序是否运作中,同样的, 若为-表示正在运作中。
- TTY:登入者的终端机位置,若为远端登入则使用动态终端介面 (pts/n);
- TIME:使用掉的 CPU 时间,注意,是此程序实际花费 CPU 运作的时间,而不是系统时间;
- CMD:就是 command 的缩写,造成此程序的触发程式之指令为何
2、使用 pstree 与 ps aux 观察全系统的程序
-
pstree命令的安装
1、在 Mac OS上
brew install pstree
2、在 Fedora/Red Hat/CentOS
yum -y install psmisc
3、在 Ubuntu/Debian
apt-get install psmisc -
直接显示出程序关系树 -A
- 若需要加上 PID 与使用者资料,可以直接使用 -up 来加入即可
3、 ps aux查看程序看见的信息也更丰富
- USER:该 process 属于那个使用者账号的
- PID :该 process 的程序识别码
- %CPU:该 process 使用掉的CPU 资源百分比
- %MEM:该 process 所占用的实体内存百分比
- VSZ :该 process 使用掉的虚拟内存
- (Kbytes) RSS :该 process 占用的固定的内存 (Kbytes)
- TTY :该 process是在那个终端机上面运作,若与终端机无关则显示,另外,tty1-tty6是本机上面的登入者程序,若为pts/0等等的,则表示为由网络连接主机的程序
- STAT:该程序目前的状态,状态显示与ps -l 的 S 旗标相同 (R/S/T/Z)
- START:该 process 被触发启动的时间
- TIME :该 process 实际使用 CPU 运作的时间
- COMMAND:该程序的实际指令为何
4、top动态观察程序
- id 越高代表系统越闲置,wa 越高代表程序卡在硬盘或者网络上,此时系统性能比较差
- 选项与参数:
-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 软件的按键
[root@192 ~]# top -d 2
top - 05:03:27 up 8:13, 1 user, load average: 0.00, 0.00,
Tasks: 135 total, 1 running, 134 sleeping, 0 stopped,
%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 h
MiB Mem : 1800.6 total, 1086.7 free, 252.8 used, 4
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 13
...
[root@192 ~]# ls -l
总用量 12
-rw-r--r--. 1 root root 22 10月 28 04:30 !
-rw-------. 1 root root 1180 10月 23 22:57 anaconda-ks.cfg
-rw-r--r--. 1 root root 0 10月 28 02:30 file1
-rwxr-xr-x. 1 root root 22 10月 28 04:30 sleep500.sh
drwxr-xr-x. 3 root root 41 10月 28 03:31 yyt1
[root@192 ~]# top -b -n 2 > ~/file1
[root@192 ~]# cat file1
top - 05:09:32 up 8:19, 1 user, load average: 0.00, 0.00,
Tasks: 137 total, 2 running, 135 sleeping, 0 stopped, 0
%Cpu(s): 0.0 us, 3.1 sy, 0.0 ni, 96.9 id, 0.0 wa, 0.0 hi
MiB Mem : 1800.6 total, 1086.7 free, 252.8 used, 46
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 135
PID USER PR NI VIRT RES SHR S %CPU %MEM
1 root 20 0 179100 13492 8532 S 0.0 0.7
2 root 20 0 0 0 0 S 0.0 0.0
3 root 0 -20 0 0 0 I 0.0 0.0...
...
- bash PID 可由 $$ 变数取得,请使用 top 持续观察该 PID
[root@study ~]# echo $$
3325
[root@study ~]# top -d 2 -p 3325
top - 05:15:28 up 8:25, 1 user, load average: 0.00, 0.00, 0
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.2 hi,
MiB Mem : 1800.6 total, 1086.6 free, 252.8 used, 461
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 135
top 程式执行的状态列,每个项目目的意义为:
- PID :每个 process 的识别码 (PID)
- USER:该process 所属的使用者;
- PR :Priority 的简写,程序的优先执行顺序,越小越早被执行;
- NI :Nice 的简写,与 Priority 有关,也是越小越早被执行;
- %CPU:CPU 的使用率;
- %MEM:内存的使用率;
- TIME+:CPU 使用时间的累加;
- COMMAND:指令
3、 程序的优先序 PRI 于 NI
-
系統运作时,内存內的程序量非常的大,但每个程序的重要性都不一样。为了让系统比较快速的执行重要的程序,因此设计上增加Priority(PRI) 这个优先序的设定。基本上,PRI 越低代表系统会执行较多次该程序,也就是该程序会比较早被执行完毕(因为同一周期会被执行较多次)
-
Linux 提供一个名为 Nice (NI) 的数值来让使用者影响程序的 PRI:
PRI(new) = PRI(old) + NI
- NI 的使用是有限制的,基本限制如下:
nice 值可调整的范围为 -20 ~ 19 ;
root 可随意调整自己或他人程序的 Nice 值,且范围为-20~19;
一般使用者仅可调整自己程序的 Nice 值,且范围仅为 0 ~ 19 (避免一般用户抢占系统资源)
要影响 NI 主要透过 nice 与 renice 来处理,也能够透过top 來处理已经存在的程序的 NI。
一开始执行程式就立即给予一个特定的 nice 值:用 nice 指令;
调整某个已经存在的 PID 的 nice 值:用 renice 指令或 top 指令
4、bash 的工作管理
- 工作管理 (job control) 是用在 bash 环境下的,也就是说:当用户登入系统取得 bash shell之后,在单一终端机介面下同时进行多个工作的行为管理 用户在登入 bash后,可以一边复制档案、一边进行搜索资料、一边进行编译,还可以一边进行 vim 程式撰写之意
- 在工作管理时应该注意:
这些工作所触发的程序必须是来自于自己的子程序(只管理自己的程序)
.前台:你可以控制与下达指令的这个环境称为前景的工作
. 后台:可以自行运行的工作,自己无法使用ctrl+c终止他,可使用bg/fg呼叫该工作
.背景中:执行的程序不能等terminal/shell的输入(input)
- 常见的工作管理使用的符号与组合:
. &:将指令丟到后台中执行 & eg:cp file1 file2 & 复制file1并改名为file2 在后台运行
. command&:直接将command丢到背景中执行,若有输出,最好使用资料流重导向输出到其他档案
.ctrl+z:将目.录正在前景中的工作丢到背景中暂停
.jobs[-l]:列出目前的工作信息
. fg%n:将第n个在背景当中的工作移到前景来操作
. bg%n:将第n个在背景中的工作变成执行中
5、特殊权限 SUID/SGID/SBIT 的功能
- SUID 的基本功能为:
.SUID 权限仅对二进制程式(binary program)有效;
. 执行者对于该程式需要具有 x 的可执行权限
.本权限仅在执行该程式的过程中有效(run-time)
. 执行者将具有该程式拥有者 (owner) 的权限
- 对于文档SGID 的功能為为:
.SGID 对二进制程式有用
.程式执行者对于该程式来说,需具备 x 的权限
. 执行者在执行的过程中将会获得该程式群组的支援
- 对于目录来说SGID ,当一个目录设定了 SGID 之后,会具有如下的功能:
. 使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录
. 使用者在此目录下的有效群组(effective group)将会变成该目录的群组
. 用途:若使用者在此目录下具有 w的权限(可以新建文档),则使用者所建立的新文档,该新文档的群组于此目录的群组相同
- SBIT 的功能与观察
.当使用者对于此目录具有 w, x 权限,亦即具有写入的权限时
.当使用者在该目录下建立文档或目录时,仅有自己与root 才有权力刪除该文档
- SUID/SGID/SBIT 权限的设定,权限分数的计算方式为:
4为 SUID
2 为 SGID
1 为 SBIT
-
除数字法赋值之外,符号法的使用上,可以使用类似底下的方式分別给予SUID/SGID/SBIT:
SUID: chmod u+s filename SGID: chmod g+s filename SBIT: chmod o+t filename
- eg:/tmp 的传统全此案为drwxrwxrwx (777) 外加一个SBIT,因此分数为1777
- /usr/bin/locate 传统权限为-rwx–x--x (711) 外加一个 SGID,因此分数会成为2711
- /usr/bin/passwd 的传统权限是-rwxr-xr-x (755),外加一个 SUID,因此分数成为4755
6、job control 的管理
- 1、&:把程序放到后台中去运行
eg:cp /file1 yyt1/file2 &
[root@192 yyt1]# cd ..
[root@192 ~]# cp ~/file1 yyt1/file2 &
[1] 2727
[root@192 ~]# jobs
[1]+ 已完成 cp -i ~/file1 yyt1/file2
[root@192 ~]# cd yyt1
[root@192 yyt1]# ls -l
总用量 4
-rw-r--r--. 1 root root 0 10月 28 03:31 file2
-rw-r--r--. 1 root root 54 10月 27 22:04 wy
2、将运行中的程序放到后台中去暂停
- [ctrl]-z:当程序运行时,摁下[ctrl]-z程序就会停止并存入后台方便后面拿出来运行
[root@192 ~]# find / -print
/sys/fs/selinux/booleans/virt_sandbox_use_sys_admin
/sys/fs/selinux/booleans/virt_sandbox_use_netlink
/sys/fs/selinux/booleans/virt_sandbox_use_audit
...
ry.failcnt
/sys/fs/cgroup/memory/system.sl^Z
[1]+ 已停止 find / -print
3、观察后台程序的状态
- jobs:可以看到后台的程序及他们的状态
- 参数
-l :除了列出 job number 与指令串之外,同时列出 PID 的号码;
-r :仅列出正在背景 run 的工作;
-s :仅列出正在后台中暂停(stop) 的工作。 `
[root@192 ~]# jobs -l
[1]+ 已停止 find / -print
[root@192 ~]# jobs -s
[1]+ 已停止 find / -print
[root@192 ~]# jobs -r
[root@192 ~]#
后台只有一个刚才停止的程序,所以jobs -l和jobs -s显示的是一样的,而没有正在运行的程序,所以jobs -r没有反应
4、将后台的程序拿到前台来运行完成
- fg:可以把后台的程序调出来运行
[root@192 ~]# jobs -l
[1]+ 2740 Stopped find / -print
[root@192 ~]# fg %1
...
.service-pxZAvm/tmp
/tmp/text.txt
/home
[1]+ 已完成 find / -print
[root@192 ~]# jobs -l
[root@192 ~]#
5、让后台的程序变成运行中
- bg:把后台暂停的程序变成运行中完成
[root@192 ~]# jobs
[1]+ 已停止 find / *.log
[root@192 ~]# bg %1
...
/tmp/text.txt
/home
find: ‘*.log’: No such file or directory
[1]+ 退出 1 find / *.log
6、终止后台的程序
killall:
-i :interactive 的意思,互动式的,若需要刪除时,会出现提示字元给使用者
-e :exact的意思,表示后面接的 command name 要一致,但整个完整的指令不能超过 15 个字元
-I :指令名称(可能含参数)忽略大小写
- kill:将后台的程序杀死掉
- kill 后面接的数字预设会是 PID ,如果想要管理 bash 的工作控制,就得要加上 %数字 了
- 参数:
-l :这个是 L 的小写,列出目前 kill 能够使用的信号 (signal) 有哪些
signal :代表给予后面接的那个工作什么样的指示,用 man 7 signal 知:
- -1 :重新读取一次参数的设定档 (类似 reload)
- -2 :代表与由键盘输入 [ctrl]-c 同样的动作
- -9 :立刻强制删除一个工作
- -15:以正常的程序方式终止一项工作。与 -9 是不一样的
[root@192 ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
...
[root@192 ~]# jobs -l
[1]+ 2800 Stopped find / -print
[root@192 ~]# kill -9 %1;jobs
[1]+ 已停止 find / -print
[root@192 ~]# jobs
[1]+ Killed find / -print
[root@192 ~]#find / -print
...
/proc/891/wchan
/proc/891/stack
/proc/891/schedstat
^Z
[1]+ 已停止 find / -print
[root@192 ~]# kill -SIGTERM %1
[root@192 ~]# jobs
[1]+ Terminated find / -print
7、离线管理的问题
- 在工作管理当中提到的后台指的是在终端机模式下可以避免 [ctrl]-c 中断的一个情景,你可以说那个是 bash的后台,并不是放到系统的后台
- at 是将程序放置到系统后台,nohup 可以让你在离线或登出系统后,还能够让程序继续进行
nohup [指令与参数] <==在终端机后台工作
nohup [指令与参数] & <==在终端机前台工作
[root@study ~]# vim sleep500.sh
#!/bin/bash
/bin/sleep 500s
/bin/echo "I have slept 500 seconds."
[root@study ~]# chmod a+x sleep500.sh
[root@study ~]# nohup ./sleep500.sh &
[2] 14812
[root@study ~]# nohup: ignoring input and appending output to `nohup.out' <==会告知这个信息!
[root@study ~]# exit
8、程序管理
1、nice/renice(重新定nice的值)
- PRI 与NI 的相关性如下:
PRI(new) = PRI(old) + nice
- nice 值可调整的范围为-20 ~ 19 ;
- root 可随意调整自己或他人程序的Nice 值,且范围为-20 ~ 19 ;
- 一般使用者仅可调整自己程序的Nice 值,且范围仅为0 ~ 19 (避免一般用户抢占系统资源);
- 一般使用者仅可将nice值越调越高,例如本来nice 为5 ,则未来仅能调整到大于5;
[root@bogon ~]# nice -n -5 vim &
[1] 1747
[root@bogon ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY
...
[1]+ 已停止 nice -n -5 vim
[root@bogon ~]# kill -9 %1
[1]+ 已停止 nice -n -5 vim
[root@bogon ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY
...
[1]+ Killed nice -n -5 vim
2、系统资源的观察
free:
- -b :直接输入 free时,显示的单位是 Kbytes,我们可以使用 b(bytes), m(Mbytes),k(Kbytes), 及 g(Gbytes) 来显示单位 也可以直接让系统自己指定单位 (-h)
- -t :在输出的最终结果,显示硬盘与 swap 的总量。
- -s :可以让系统每几秒输出出一次,不间断的一直输出的意思对于系统观察挺有效
- -c :与 -s 同时处理~让free 列出几次的意思~
[root@bogon ~]# free -m
total used free shared buff/cache available
Mem: 1800 226 1305 8 268 1417
Swap: 2047 0 2047
3、uptime:观察系统启动时间与工作负载
[root@bogon ~]# uptime
10:47:21 up 4:00, 2 users, load average: 0.00, 0.00, 0.00
4、 查阅系统与核心相关的信息
uname:
- -a :所有系统相关的信息,包括底下的资料都会被列出來;
- -s :系统核心名称
- -r :核心的版本
- -m :本系统的硬件名称,例如 i686 或 x86_64 等;
- -p :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型
- -i :硬件的平台 (ix86)
[root@bogon ~]# uname -a
Linux bogon 4.18.0-193.el8.x86_64 #1 SMP Fri May 8 10:59:10 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
5、追踪网路或插槽档
netstat :
- -a :将目前系统上所有的连线、监听、Socket 资料都列出来
- -t :列出 tcp 网路封包的资料
- -u :列出 udp 网路封包的资料
- -n :不以程序的服务名称,以端口号 (port number) 来显示;
- -l :列出目前正在网络监听 (listen) 的服务;
- -p :列出该网络服务的程序 PID
[root@bogon ~]# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 bogon:ssh bogon:50260 ESTABLISHED
udp 0 0 bogon:bootpc bogon:bootps ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 3 [ ] DGRAM 13311 /
...
[root@bogon ~]# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 917/sshd
tcp6 0 0 :::22 :::* LISTEN 917/sshd
udp 0 0 127.0.0.1:323 0.0.0.0:* 861/chronyd
udp6 0 0 ::1:323 :::* 861/chronyd
6、由档案(或档案系统)找出正在使用该档案的程序
fuser:
- -u :除了程序的 PID 之外,同时列出该程序的拥有者
- -m :后面接的那个档名会主动的上提到该档案系统的最顶层,对 umount 不成功很有效
- -v :可以列出每个档案与程序还有指令的完整相关性
- -k :找出使用该档案/目录的 PID ,并试图以 SIGKILL 这个信号给予该PID;
- -i :必须与 -k 配合,在刪除 PID 之前会先询问使用者意愿
- -signal:例如 -1 -15 等等,若不加的話,默认是 SIGKILL (-9)
[root@bogon ~]# fuser -uv .
用户 进程号 权限 命令
/root: root 1437 ..c.. (root)bash
root 1470 ..c.. (root)bash
[root@bogon ~]# fuser -uv /proc
用户 进程号 权限 命令
/proc: root kernel mount (root)/proc
[root@bogon ~]# fuser -muv .
用户 进程号 权限 命令
/root: root kernel mount (root)/
root 1 .rce. (root)systemd
root 2 .rc.. (root)kthreadd
root 3 .rc.. (root)rcu_gp
root 4 .rc.. (root)rcu_par_gp
root 6 .rc.. (root)kworker/0:0H
7、列出被程序所打开的文档名称
lsof :
- -a :多项资料需要同时成立才显示出结果时
- -U :仅列出 Unix like 系统的 socket 文档类型
- -u :后面接 username,列出该使用者相关程序所打开的文档
- +d :后面接目录,亦即找出某个目录底下已经被打开的文档
[root@bogon ~]# lsof -u root -a -U
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 15u unix 0xffff992c559b7080 0t0 21437 /run/systemd/private type=STREAM
...
[root@bogon ~]# lsof +d /dev
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 0u CHR 1,3 0t0 31 /dev/null
...
[root@bogon ~]# lsof -u root | grep bash
bash 1437 root cwd DIR 253,0 219 33575041 /root
bash 1437 root rtd DIR 253,0 224 128 /
...
8、找出某支正在执行的程式的 PID
pidof :
- -s :仅列出一个 PID 而不列出所有的 PID
- -x :同时列出该 program name 可能的 PPID 那个程序的 PID
[root@bogon ~]# pidof systemd rsyslogd
1431 1426 1
- 常见问题:
1、eg:/usr/local/bin/ls与/bin/ls那么当我下达ls 的时候,哪个ls会被执行?
答:/user/local/bin/ls会被执行,越前面的越先被 执行
2、