一,名词解释
1,什么是进程?
进程是已启动的可执行程序的运行实例,进程有以下组成部分:
• 已分配内存的地址空间;
• 安全属性,包括所有权凭据和特权;
• 程序代码的一个或多个执行线程;
• 进程状态。
程序: 二进制文件,静态 /bin/date, /usr/sbin/httpd,/usr/sbin/sshd, /usr/local/nginx/sbin/ngix
进程: 是程序运行的过程, 动态,有生命周期及运行状态。
2,进程的生命周期
父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程 ID (PID),满足跟踪安全性之需。PID 和 父进程 ID (PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代:
Centos5/6: init
Centos7: systemd
子进程继承父进程的安全性身份、过去和当前的文件描述符、
端口和资源特权、环境变量,以及程序代码。
随后,子进程可能exec自己的程序代码。
通常,父进程在子进程运行期间处于睡眠(sleeping)状态。
当子进程完成时发出(exit)信号请求,在退出时,
子进程已经关闭或丢弃了其资源环境,剩余的部分称之为僵停(僵尸Zombie)。父进程在子进程退出时收到信号而被唤醒,
清理剩余的结构,然后继续执行其自己的程序代码。
3, 进程状态
在多任务处理操作系统中,每个CPU(或核心)
在一个时间点上只能处理一个进程。
在进程运行时,它对CPU 时间和资源分配的要求会不断变化,
从而为进程分配一个状态,它随着环境要求而改变。
二,查看进程 process
1,目标了解如进程的:
• PID,PPID
• 当前的进程状态
• 内存的分配情况
• CPU和已花费的实际时间
• 用户UID,它决定进程的特权
2,静态查看进程(ps)
2.1 查看进程 ps
[root@tianyun ~]# ps aux | less
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.6 128096 6708 ? Ss 16:20 0:01 /usr/lib/systemd/systemd
————————————————————————————
USER: 运行进程的用户
PID: 进程ID
%CPU: CPU占用率
%MEM: 内存占用率
VSZ: 占用虚拟内存
RSS: 占用实际内存
TTY: 进程运行的终端 (其中tty1-tty7代表本地控制台终端,tty1-tty6是本地字符界面终端,tty7是图形终端。pts/0-255代表虚拟终端。) //可以开启vim 查询到终端名称STAT: 进程状态 man ps (/STATE)
———————————————————————————
R 运行
S 可中断睡眠 Sleep,(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
D 不可中断睡眠,(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
T 停止的进程
Z 僵尸进程
X 死掉的进程
————————————————————————————
[了解]
Ss s进程的领导者,父进程
S<
SN N优先级较低的进程
R+ +表示是前台的进程组
Sl 以线程的方式运行
————————————————————————————
START: 进程的启动时间 //可以开启vim ,在用date验证。
TIME: 进程占用CPU的总时间
COMMAND: 进程文件,进程名
示例1:进程的排序
1 以CPU占比降序排列
[root@tianyun ~]# ps aux --sort %cpu |less //--sort排序,升序
2 以CPU占比升序排列
[root@tianyun ~]# ps aux --sort -%cpu |less //-%CPU降序
3 以驻留内存升序排列
[root@tianyun ~]# ps aux --sort rss |less
4 以驻留内存降序排列
[root@tianyun ~]# ps aux --sort -rss |less
示例2:进程的父子关系
安装一个进程观察,父子进程以及状态。父亲Ss 和 儿子S
[alice@tianyun ~]$ sudo yum -y install httpd //安装网站程序。
[alice@tianyun ~]$ sudo systemctl start httpd //启动网站
[alice@tianyun ~]$ sudo systemctl stop firewalld //关闭防火墙
[root@tianyun ~]# ps auxf |grep httpd //查看网站程序。
root 9279 0.0 0.0 4264 672 pts/1 S+ 14:37 0:00 \_ grep httpd
root 8310 0.0 0.1 10092 2912 ? Ss 14:19 0:00 /usr/sbin/httpd
apache 8311 0.0 0.0 10092 2060 ? S 14:19 0:00 \_ /usr/sbin/httpd
apache 8312 0.0 0.0 10092 2060 ? S 14:19 0:00 \_ /usr/sbin/httpd
apache 8313 0.0 0.0 10092 2060 ? S 14:19 0:00 \_ /usr/sbin/httpd
apache 8314 0.0 0.0 10092 2060 ? S 14:19 0:00 \_ /usr/sbin/httpd
apache 8315 0.0 0.0 10092 2060 ? S 14:19 0:00 \_ /usr/sbin/httpd
apache 8316 0.0 0.0 10092 2060 ? S 14:19 0:00 \_ /usr/sbin/httpd
apache 8318 0.0 0.0 10092 2060 ? S 14:19 0:00 \_ /usr/sbin/httpd
apache 8319 0.0 0.0 10092 2060 ? S 14:19 0:00 \_ /usr/sbin/httpd
查看进程的父子关系。 请观察PID和PPID
[root@xulei ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 1月22 ? 00:00:07 /usr/lib/systemd/systemd
root 2 0 0 1月22 ? 00:00:00 [kthreadd]
root 3 2 0 1月22 ? 00:00:06 [ksoftirqd/0]
示例3:自定义显示字段
//自定义显示字段 --------------------------------
[root@tianyun ~]# ps axo user,pid,ppid,%mem,command //xo指定列显示
[root@tianyun ~]# ps axo user,pid,ppid,%mem,command |grep httpd
root 8310 1 0.1 /usr/sbin/httpd
apache 8311 8310 0.0 /usr/sbin/httpd
apache 8312 8310 0.0 /usr/sbin/httpd
apache 8313 8310 0.0 /usr/sbin/httpd
apache 8314 8310 0.0 /usr/sbin/httpd
apache 8315 8310 0.0 /usr/sbin/httpd
apache 8316 8310 0.0 /usr/sbin/httpd
apache 8318 8310 0.0 /usr/sbin/httpd
apache 8319 8310 0.0 /usr/sbin/httpd
root 9236 6798 0.0 grep httpd
-----------------------------------------------------------
[root@tianyun ~]# ps axo user,pid,ppid,%mem,%cpu,command --sort -%cpu |less //针对某些程序,显示某些列,再进行排序。简洁明了
2.2 查看进程PID的四种方法
//查看指定进程的PID,四种方法————————
第一种。cat
[root@localhost ~]$ cat /run/sshd.pid
830
第二种。ps
[root@localhost ~]# ps aux |grep sshd
root 10180 0.0 0.0 7224 1024 ? Ss 16:00 0:00 /usr/sbin/sshd
第三种。pgrep
[root@localhost ~]# pgrep -l sshd
10180 sshd
[root@localhost ~]# pgrep sshd
10180
第四种。pidof
[root@localhost ~]# pidof sshd
10180
2.3 查看进程树
3,动态查看进程(top)
3.1 上半部分
第一部分:系统整体统计信息
top - 11:45:08 up 18:54, 4 users, load average: 0.05, 0.05, 0.05
Tasks: 176 total, 1 running, 175 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3865520 total, 1100000 free, 580268 used, 2185252 buff/cache
KiB Swap: 4063228 total, 4063228 free, 0 used. 2917828 avail Mem
负载加权值解释:—小于1正常————————————
load average: 0.86, 0.56, 0.78 系统最近 1分钟,5分钟,15分钟平均负载
第一行是任务队列:
当前时间
系统运行时间,格式为时:分
当前登录用户数
系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。
第二、三行为进程和CPU的信息:
total 进程总数
running 正在运行的进程数
sleeping 睡眠的进程数
stopped 停止的进程数
zombie 僵尸进程数
Cpu(s):
us 用户空间占用CPU百分比
sy 内核空间占用CPU百分比
ni 用户进程空间内改变过优先级的进程占用CPU百分比
id 空闲CPU百分比
wa 等待输入输出的CPU时间百分比
hi:硬件CPU中断占用百分比
si:软中断占用百分比
st:虚拟机占用百分比
第四和第五行是内存信息:
Mem:
KiB Mem代表物理内存,KiB Swap代表交换空间,它们的单位都是KiB。
total、used和free没什么好介绍的,就是总共多少,然后用了多少,还剩多少。
buff/cached代表了buff和cache总共用了多少,buff一般都比较小,跟cache比可以忽略不计;cache代表是用来缓存磁盘上文件内容的,所以占有空间很大,Linux一般会尽可能多的将空闲物理内存用于 cache。
Swap:
total 交换区总量
used 使用的交换区总量
free 空闲交换区总量
avail Mem表示可用于进程下一次分配的物理内存数量,这个大小一般比free大一点,因为除了free的空间外,系统还能立即释放出一些空间来。
其中可以观察buffers的一个小实验:
做个小实验,观察缓存的作用。
time cp -rf /etc /tmp/etc1
time cp -rf /etc /tmp/etc1
注意观察两次复制的时间,大大缩小,是因第二次的数据已经到了buffer了。
在top的buffer/cache会有体现。
3.2 下半部分
3.2.1字段的介绍:
PID,USER,%CPU,%MEM(上面已经解释)
VIRT:virtual memory usage 虚拟内存
1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量3、需要这些内存,但并没有占满
RES:resident memory usage 常驻内存
1、进程当前使用的内存大小
2、包含其他进程的共享
3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
SHR:shared memory 共享内存
1、除了自身进程的共享内存,也包括其他进程的共享内存
2、计算某个进程所占的物理内存大小公式: RES-SHR
3.2.2常用指令:
命令
h|?帮助
M 按内存的使用排序
P 按CPU使用排序
N 以PID的大小排序
R 对排序进行反转
f 自定义显示字段
1 显示所有CPU的负载
< 向前
> 向后
z 彩色,Z设置彩色,使用数字调整
W 保存top环境设置
3.3 top使用技巧
动态查看进程 top,像windows的任务管理器
[root@tianyun ~]# top //回车,立刻刷新。按z彩色显示,按F,通过光标设置列的顺序。
[root@localhost ~]# top -d 1 //每1秒刷新。
[root@localhost ~]# top -d 1 -p 10126 查看指定进程的动态信息
[root@localhost ~]# top -d 1 -p 10126,1 查看10126和1号进程
[root@localhost ~]# top -d 1 -u apache 查看指定用户的进程
[root@localhost ~]# top -d 1 -b -n 2 > top.txt //-b附加参数,只看2次top信息后写入到文件
[root@localhost ~]#vim top.txt //最后打开文件详细阅读
3.4 top的交互命令(了解)
Ctrl+L 擦除并且重写屏幕。
h或者? 显示帮助画面,给出一些简短的命令总结说明。
k 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。
i 忽略闲置和僵死进程。这是一个开关式命令。
q 退出程序。
r 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。
S 切换到累计模式。
s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。
f或者F 从当前显示中添加或者删除项目。
o或者O 改变显示项目的顺序。
l 切换显示平均负载和启动时间信息。
m 切换显示内存信息。
t 切换显示进程和CPU状态信息。
c 切换显示命令名称和完整命令行。
M 根据驻留内存大小进行排序。
P 根据CPU使用百分比大小进行排序。
T 根据时间/累计时间进行排序。
W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。
3,使用信号控制进程
3.1 信号的种类(kill)
给进程发送信号
[root@tianyun ~]#kill -l //列出所有支持的信号,后面跟进程ID,即可对进程控制
编号 信号名
1) SIGHUP 重新加载配置(平滑的重启)
2) SIGINT 键盘中断Ctrl+C
3) SIGQUIT 键盘退出Ctrl+\,类似SIGINT
9) SIGKILL 强制终止,无条件
15) SIGTERM 终止(正常结束),缺省信号
18) SIGCONT 继续
19) SIGSTOP 停止,该进程还未结束, 只是暂停执行
20)SIGTSTP 暂停Ctrl+Z
重点1,9,15。请注意1和15的区别
3.2 各种命令用法(除了上面的kill,还有killall,pkill,top)
killall [选项][信号] 进程名 //按照进程名杀死进程
选项: -i :交互式,询问是否要杀死某个进程
-I :忽略进程名的大小写
pkill [选项][信号] 进程名 // 按照进程名终止进程
选项: -t 终端号:按照终端号踢出用户
如果不知道哪些终端登陆了本机,可以使用w命令
如下:w代表的是自己。
top也可以杀死进程,top本身是查看进程的,可以top查看进程时通过交互的形式杀死进程。
以下是针对以上的几个命令列举的示例:
示例1:给vsftpd进程发送信号1,15(重新加载配置,再停止。)
1 安装文件服务器并启动。
[root@localhost ~]# yum install -y vsftpd
[root@localhost ~]# systemctl start vsftpd
[root@localhost ~]# systemctl stop firewalld
2 查询文件服务器进程。
[root@localhost ~]# ps aux |grep vsftpd
root 9160 0.0 0.0 52580 904 ? Ss 21:54 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
注意观察进程PID
3 重启进程。观察进程ID未变
[root@localhost ~]# kill -1 9160 //发送重启信号**************
例如vsftpd的配置文件发生改变,希望重新加载
root 9160 0.0 0.0 52580 904 ? Ss 21:54 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
4 发送停止信号。搜索不到进程了。
[root@localhost ~]# kill 9160 //发送停止信号****************
vsftpd服务有停止的脚本 systemctl stop vsftpd
[root@localhost ~]# ps aux |grep vsftpd
示例2:对任务计划进程(crond)发送1和15信号。
//1
[root@localhost ~]$ ps aux |grep crond
root 478 0.0 0.1 124144 1572 ? Ss 09:35 0:00 /usr/sbin/crond -n
[root@localhost ~]$ kill -1 478
[root@localhost ~]$ ps aux |grep crond
root 478 0.0 0.1 124144 1572 ? Ss 09:35 0:00 /usr/sbin/crond -n
//15
[root@localhost ~]$ kill 478
[root@localhost ~]$ ps aux |grep crond
[root@localhost ~]$ systemctl start crond
[root@localhost ~]$ ps aux |grep crond
root 22319 0.0 0.1 124140 1548 ? Ss 14:54 0:00 /usr/sbin/crond -n
示例3:信号测试9,151 创建2个文件,查看终端号。
[root@tianyun ~]# touch file1 file2
[root@tianyun ~]# tty
/dev/pts/1
2 通过一个终端,打开一个vim
[root@tianyun ~]# vim file1
3 通过另一个终端,打开一个vim
[root@tianyun ~]# tty
/dev/pts/2
[root@tianyun ~]# vim file2
3 通过另一个终端,查询两个进程。
[root@tianyun ~]# ps aux |grep vim
root 4362 0.0 0.2 11104 2888 pts/1 S+ 23:02 0:00 vim file1
root 4363 0.1 0.2 11068 2948 pts/2 S+ 23:02 0:00 vim file2
4 发送信号15 和信号9 ,观察两个终端程序状态。
[root@tianyun ~]# kill 4362
[root@tianyun ~]# kill -9 4363
观察两个终端,一个正常终止,一个非法杀死。
——————————————————————————————
5 重复第1-3步,使用killall 杀死所有vim进程。
[root@tianyun ~]# killall vim //给所有vim进程发送信号
[root@tianyun ~]# killall httpd
建议尽量不要使用kill -9
示例4:信号测试18继续,19暂停
1 查询远程登录程序SSH的进程号(使用不同终端登陆服务器)
[root@localhost ~]# ps aux |grep sshd
root 5571 0.0 0.0 64064 1164 ? Ss 09:35 0:00 /usr/sbin/sshd
2 发送暂停信号,并查询状态Ts
[root@localhost ~]# kill -STOP 5571 //等同于-19
[root@localhost ~]# ps aux |grep sshd
root 5571 0.0 0.0 64064 1164 ? Ts 09:35 0:00 /usr/sbin/sshd
看到状态为Ts不再接受处理。T停止状态
3 发送继续信号,查看状态,发现终端可以继续运行。
[root@localhost ~]# kill -cont 5571 //等同于-18
[root@localhost ~]# ps aux |grep sshd
root 5571 0.0 0.0 64064 1164 ? Ss 09:35 0:00 /usr/sbin/sshd
又继续运行了。cont 就S 状态了。
示例5:演示信号18和19计划任务
1 查看计划任务程序crond
[root@localhost ~]$ ps aux |grep crond
root 22319 0.0 0.1 124140 1568 ? Ss 14:54 0:00 /usr/sbin/crond -n
yang 22427 0.0 0.0 112648 964 pts/2 R+ 15:07 0:00 grep --color=auto crond
2 暂停计划任务程序。
[root@localhost ~]$
[root@localhost ~]$ sudo kill -19 22319
[root@localhost ~]$ ps aux |grep crond
root 22319 0.0 0.1 124140 1568 ? Ts 14:54 0:00 /usr/sbin/crond -n
yang 22431 0.0 0.0 112648 964 pts/2 R+ 15:07 0:00 grep --color=auto crond
3 继续计划任务程序。观察状态
[root@localhost ~]$
[root@localhost ~]$ sudo kill -cont 22319
[root@localhost ~]$ ps aux |grep crond
root 22319 0.0 0.1 124140 1568 ? Ss 14:54 0:00 /usr/sbin/crond -n
yang 22436 0.0 0.0 112648 960 pts/2 R+ 15:08 0:00 grep --color=auto crond
总结:kill带ID,killall带程序名称
kill (PID or Job ID) killall (name)
示例6:踢出一个从远程登录到本机的用户(杀死一个用户)
1 查看pkill命令
[root@tianyun ~]# pkill --help
大家多看帮助,翻译可以借助软件。
2 请使用一个普通用户登录系统。杀掉一个连接用户。
[root@tianyun ~]# pkill -u alice
杀掉了用户。
示例7:杀死一个终端1 查询当前用户。发现多人用同一个账号登录系统。在其中一个普通账户上开启一个sleep程序。
[root@localhost ~]# w
06:48:38 up 4 min, 4 users, load average: 0.07, 0.14, 0.08
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.100.254 06:44 3:58 0.05s 0.05s -bash
root pts/1 192.168.100.254 06:44 6.00s 0.04s 0.00s w
aofa pts/2 192.168.100.254 06:44 6.00s 0.03s 0.00s sleep 3000
2 杀掉用户有个问题,多人用同一个用户。可以用终端pkill掉
[root@localhost ~]# pkill -t pts/2 //终止pts/2上所有进程
3 回到pts/2终端观察进程状态。
[aofa@localhost ~]$ sleep 3000
已终止
4 第三步杀死的只是终端上的程序。要想杀死该用户的终端,使用-9
[root@localhost ~]# pkill -9 -t pts/2
//终止pts/2上所有进程 并结束该pts/2
5 观察用户登录情况。少了aofa用户。
[root@localhost ~]# w
06:51:30 up 7 min, 3 users, load average: 0.07, 0.10, 0.06
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.100.254 06:44 6:50 0.05s 0.05s -bash
root pts/1 192.168.100.254 06:44 2.00s 0.05s 0.01s w
示例8:top杀死一个进程
top也可杀死进程
1 请使用一个终端,开启一个进程。
[aofa@localhost ~]$ sleep 10000
2 在另一个终端查询并杀死该进程。
[root@localhost ~]# ps aux | grep sleep
root 2004 0.0 0.0 107896 604 ? S 06:51 0:00 sleep 60
aofa 2058 0.0 0.0 107896 604 pts/2 S+ 06:52 0:00 sleep 10000
root 2063 0.0 0.0 112664 972 pts/1 R+ 06:52 0:00 grep --color=auto sleep
3 通过top杀死该进程。
[root@localhost ~]# top -d 1 -p 2058
k
9
回车
4,进程优先级nice
4.1 简介
Linux操作系统是一个多用户、多任务的操作系统,Linux系统中通知运行着非常多的进程。但是cup在同一个始时钟周期内只能运行一个指令。进程优先级决定了每个进程处理的先后顺序。进程的调度可以让多个进程在cup上面高速的切换,从而给用户多个进程在同时运行的印象。
4.2 相对优先级nice
4.2.1调度策略
1,普通策略:sched——other常用调度:TS
2,高级策略:sched——fifo先进先出:FS
4.2.2普通的调度策略1,nice值得范围:
nice 值越高: 表示优先级越低,例如+19,该进程容易将CPU 使用量让给其他进程。
nice 值越低: 表示优先级越高,例如-20,该进程更不倾向于让出CPU。
2,nice值和PR(PRI)值 //PR和PRI都是Priority优先级的意思,显示不同跟Centos版本有关。
在top中显示的优先级有两个,PR(PRI)值和nice值
查看进程的nice级别
1. 使用top查看nice级别
NI: 实际nice值
PR(PRI): 将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39
4.3 查看进程的nice级别 使用ps查看nice级别(自定义,显示pid 和comm以及nice值并排序。)
[root@localhost ~]# ps axo pid,command,nice,cls --sort=-nice
cls表示显示策略列。
TS 表示该进程使用的调度策略为SCHED_OTHER
FF表示高级进程first in first out。
4.4 启动具有不同nice级别的进程
示例:不同的nice值
启动具有不同nice级别的进程
启动进程时,通常会继承父进程的 nice级别,默认为0。观察两个程序的不同nice值。
[root@localhost ~]# nice -n -5 sleep 6000 &
[1] 2220
[root@localhost ~]# nice -n -10 sleep 7000 &
[2] 2229
[root@localhost ~]# ps axo command,pid,nice | grep sleep
sleep 6000 2220 -5
sleep 7000 2229 -10
grep --color=auto sleep 2233 0
4.5 更改现有进程的nice级别
1,使用top更改
更改现有进程的nice级别
1 打开一个程序
[root@localhost ~]# sleep 12345 &
[1] 2630
2 查询该进程
[root@localhost ~]# ps aux | grep sleep
root 2630 0.0 0.0 107896 604 pts/0 S 07:29 0:00 sleep 12345
3 使用top更改nice级别
[root@localhost ~]# top -d 1 -p 2630
按r键 //调整进程的优先级(Nice Level) (-20高) ---0--- (19低)
回车 //确认该程序。
-20
回车 //确认修改nice值。
如果直接使用top,使用R调整nice值,先输入PID,再输入nice值即可。
2,使用shell更改
使用shell更改nice级别
1 创建一个睡眠程序。
[root@localhost ~]# sleep 7000 &
[2] 2669
2 修改他的nice值。
[root@localhost ~]# renice -20 2669
2669 (进程 ID) 旧优先级为 0,新优先级为 -20
观察修旧的nice值。
注意:nice [选项] 命令 //可以给新执行的命令直接赋予NI值,但是不能修改已经存在进程的NI值
例如:nice -n -5 service httpd startrenice [优先级] PID //renice命令是修改已经存在进程的NI值得命令
例如:renice -10 2125
三,作业控制 jobs(了解)
3.1 简介
作业控制是一个命令行功能,允许一个shell 实例来运行和管理多个命令。
如果没有作业控制,父进程fork()一个子进程后,将sleeping,直到子进程退出。
使用作业控制,可以选择性暂停,恢复,以及异步运行命令,让 shell 可以在子进程运行期间返回接受其他命令。
关键词介绍
foreground, background, and controlling terminal
foreground: 前台进程:是在终端中运行的命令,该终端为进程的控制终端。前台进程接收键盘产生的输入和信号,并允许从终端读取或写入到终端。
background: 后台进程:没有控制终端,它不需要终端的交互。
3.2 作业控制示例
示例1:前后台调动
[root@tianyun ~]# sleep 2000
运行一个程序,当前终端无法输入。
1 直接运行后台程序。暂停一个前台程序。
[root@tianyun ~]# sleep 3000 & //运行程序(时),让其在后台执行
[root@tianyun ~]# sleep 4000 //^Z,将前台的程序挂起(暂停)到后台
[2]+ Stopped sleep 4000
2 查询所有程序。注意一个是后台运行S,一个后台暂停T。
[root@tianyun ~]# ps aux |grep sleep
root 8895 0.0 0.0 100900 556 pts/0 S 12:13 0:00 sleep 3000
root 8896 0.0 0.0 100900 556 pts/0 T 12:13 0:00 sleep 4000
3 只查看后台进程。
[root@tianyun ~]# jobs //查看后台作业
[1]- Running sleep 3000 &
[2]+ Stopped sleep 4000
4 执行暂停程序,和调动后台程序至前台。
[root@tianyun ~]# bg 2 //让作业2在后台,从暂停到运行
[root@tianyun ~]# fg 1 //将作业1调回到前台
[root@tianyun ~]# kill %1 //kill %1,结束后台作业1.
注意,kill 1 和 kill %1 不同,前者终止PID为1的进程,后者杀死作业。
示例2:如何管理远程主机
[root@tianyun ~]# ssh 172.16.50.240
[root@www ~]# yum -y install screen
[root@www ~]# screen -S install_apache //-S启动会话的名字
sleep 9000
==断网后,重新连接==
[root@www ~]# screen -list
There are screens on:
28958.install_nginx (Detached)
29013.install_apache (Detached)
2 Sockets in /var/run/screen/S-root.
[root@www ~]# screen -r 29013
示例3:(了解)
&符号在程序的末尾才是后台运行,请看下面的例子,命令中的&并不是后台运行的意思。
while :; do date; sleep 2; done //查询时间,间隔两秒。ctrl+C停止。
[root@tianyun ~]# (while :; do date; sleep 2; done) & //进程在后台运行,但输出依然在当前终端(使用fg调到前台,ctrl+C终止。)
[root@tianyun ~]# (while :; do date; sleep 2; done) &>/dev/null &
四,文件系统proc(了解)
4.1 简介
虚拟化文件系统:内存、进程运行的状态信息
4.2 cup
/proc/cpuinfo
[root@tianyun ~]# grep 'processor' /proc/cpuinfo //逻辑cpu的个数
processor : 0
processor : 1
[root@tianyun ~]# grep 'physical id' /proc/cpuinfo //物理cpu的个数
physical id : 0
physical id : 0
==flags
lm(64位)---------------------------------
vmx 支持虚拟化 Intel----------------------
svm 支持虚拟化 AMD-------------------------
[root@tianyun ~]# egrep 'lm|vmx|svm' /proc/cpuinfo
flags : fpu vme de clflush dts acpi lm constant_tsc pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr lahf_lm
flags : fpu vme de clflush dts acpi lm constant_tsc pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr lahf_lm
[root@tianyun ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 2
Core(s) per socket: 2
Socket(s): 1
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 3072K
NUMA node0 CPU(s): 0-3
4.3 内存/proc/meminfo
[root@tianyun ~]# less /proc/meminfo
[root@tianyun ~]# free -m
total used free shared buff/cache available
Mem: 7950 704 6540 100 705 6908
Swap: 2047 0 2047
4.4 内核/proc/cmdline //内核启动参数
[root@tianyun ~]# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-327.el7.x86_64 root=UUID=9b17ab4e-cd93-4f84-bd1e-7241a0baac9b ro rhgb quiet LANG=zh_CN.UTF-8
4.5 使用率uptime
[root@tianyun ~]# uptime
17:20:58 up 8:33, 3 users, load average: 0.43, 0.36, 0.36
4.6 网络[root@tianyun ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@tianyun ~]# echo 0 > /proc/sys/net/ipv4/ip_forward
[root@tianyun ~]# cat /proc/sys/net/ipv4/ip_forward