Linux 重定向 源码包 进程管理 系统负载 启动流程及管理
一、重定向
什么是重定向?
将原本要输出在屏幕中的内容,重新定向输出到指定的文件或设备中。
为什么要使用重定向?
1. 重定向的分类
- 标准输入
- 标准输出
#将错误输出,重定向到黑洞
[root@localhost ~]# ls /ooo 2>/dev/null
2. 管道技术
1. 管道操作符号“ | ”叫做管道符
作用:将管道符左边命令的标准输出,交给管道符右边命令的标准输入来处理
用法:cmd1|cmd2|cmd3| cmd4...
2. 统计出passwd文件中,所有用户的shell种类
[root@localhost ~]# awk -F: '{print $7}' /etc/passwd|sort |uniq|wc -l
6
3. tee 和 重定向的区别
[root@zls ~]# date > date.txt
[root@zls ~]# date |tee date.txt
3. 命令传递参数 xargs
xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。
xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。
之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了 xargs 命令,例如:
将查询结果复制到tmp下。
[root@localhost opt]# find /etc/ -name '*.conf'|xargs cp -t /tmp/
查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件
[root@localhost log]# find /home/omc/ -maxdepth 1 -user root -type f | xargs file {}
二、安装与自制源码包
1. nginx源码包安装
## 源码安装nginx
====================
# 0.安装依赖
[root@qls nginx-1.16.1]# yum install -y gcc gcc-c++ glibc zlib-devel pcre-devel openssl-devel
# 1.下载nginx源码包
[root@qls ~]# wget http://nginx.org/download/nginx-1.16.1.tar.gz
# 2.解压
[root@qls ~]# tar xf nginx-1.16.1.tar.gz
[root@qls ~]# cd nginx-1.16.1
# 3.生成
[root@qls ~]# mkdir /app
[root@qls nginx-1.16.1]# useradd nginx -s /sbin/nologin -M
[root@qls nginx-1.16.1]# ./configure --prefix=/app/nginx-1.16.1 --user=nginx --group=nginx
# 4.编译
[root@qls nginx-1.16.1]# make
# 5.安装
[root@qls nginx-1.16.1]# make install
# 6.检测配置文件有没有语法错误
[root@qls sbin]# /app/nginx-1.16.1/sbin/nginx -t
nginx: the configuration file /app/nginx-1.16.1/conf/nginx.conf syntax is ok
nginx: configuration file /app/nginx-1.16.1/conf/nginx.conf test is successful
# 7.启动nginx
[root@qls sbin]# /app/nginx-1.16.1/sbin/nginx
# 8.检测80端口
[root@qls sbin]# netstat -lntup|grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 13468/nginx: master
# 9.做软连接
[root@qls nginx-1.16.1]# ln -s /app/nginx-1.16.1 /app/nginx
2. 自制rpm包安装
[root@qls ~]# mkdir fpm
[root@qls ~]# mv fpm-1.3.3.x86_64.tar.gz fpm
[root@qls fpm]# cd /root/fpm/
# 1. 解压
[root@qls fpm]# tar xf fpm-1.3.3.x86_64.tar.gz
# 2.安装ruby
[root@qls fpm]# yum -y install ruby rubygems ruby-devel rpm-build
# 3.查看gem的源
[root@qls fpm]# gem sources --list
*** CURRENT SOURCES ***
https://rubygems.org/
# 4.更换阿里云的源 先移除国外源
[root@qls fpm]# gem sources --remove https://rubygems.org/
# 5.更换阿里云的源, 添加阿里云的源
[root@qls fpm]# gem sources -a https://mirrors.aliyun.com/rubygems/
# 6.使用gem命令安装当前目录下所有的.gem文件
[root@qls fpm]# gem install *.gem
# 7.写出安装rpm之后要执行的脚本
[root@qls ~]# vim /root/nginx.sh
#!/bin/bash
useradd nginx -s /sbin/nologin -M
ln -s /app/nginx-1.16.1 /app/nginx
# 8.使用fpm打包
[root@qls fpm]# fpm -s dir -t rpm -n nginx -v 1.16.1 -d 'zlib-devel,gcc,gcc-c++,glibc,pcre-devel,openssl-devel' --post-install /root/nginx.sh -f /app/nginx-1.16.1/
三、进程管理
1. 进程的监控ps
# 监控进程状态命令-ps
-A (-e)列出所有的行程
a:查看所有终端进程
x:查看所有的非终端进程
u:查看每个进程的用户
f:查看子进程
USER:启动该进程的用户
PID:进程的ID号
%CPU:占用cpu的百分比
%MEM:占用内存的百分比
VSZ:虚拟内存集(进程占用虚拟内存的空间)
RSS:真实物理内存(进程占用物理内存的空间)
TTY:运行的终端
?:内核运行的终端
tty:机器运行的终端
pts/0:远程连接的终端
STAT:进程的状:
D: #无法中断的休眠状态(通IO的进程)
R: #正在运行的状态
S: #处于休眠的状态
T: #暂停或被追踪的状态
W: #进入内存交换(从内核2.6开始无效)
X: #死掉的进程(少见)
Z: #僵尸进程
<: #优先级高的进程
N: #优先级较低的进程
L: #有些页被锁进内存
s: #父进程(在它之下有子进程开启着)
l: #以线程的方式运行
|: #多进程的
+: #该进程运行在前台
START:进程被触发启动的时间
TIME:进程实际使用cpu的时间
COMMAND:进程启动的命令
[root@qls ~]# ps auxf|grep nginx
o:自定义查看想要看的字段
ps axo user,pid,%cpu,%mem,command
--sort:排序,可以根据ps的所有字段
ps aux --sort %cpu
# 查看pid的额外命令
pgrep nginx
pidof nginx
- ps -ef|grep nginx 与 ps -ef |grep [n]ginx 区别
2. 进程的管理top
[root@db01 ~]# top
=====================
top - 12:19:36 up 3:37, 2 users, load average: 0.00, 0.03, 0.05
# 12:19:36 :当前系统的时间
# up 3:37 :运行时长
# 2 users :当前登录的用户1
# load average: 0.00, 0.03, 0.05
服务器的负载:
0.00:1分钟的负载
0.03:5分钟的负载
0.05:15分钟的负载
Tasks: 105 total, 1 running, 104 sleeping, 0 stopped, 0 zombie
# 105 total:目前有105个工作任务
# 1 running:1个正在执行的
# 104 sleeping:104个在等待被执行的
# 0 stopped:没有被停止的
# 0 zombie:0个僵尸进程
%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
# 0.0 us:用户态(user用户使用cpu的百分比)
# 0.3 sy:内核态(system系统进程占用cpu的百分比)
# 0.0 ni:优先级
# 99.7 id:CPU空闲程度
# 0.0 wa:(wait等待状态的进程)
# 0.0 hi:硬中断
# 0.0 si:软中断
# 0.0 st:虚拟机(如果当前系统安装了虚拟机)KVM,vitural box
-d:指定变化时间
-p:只查看指定PID的进程
-u:只查看指定用户的进程
-b:保存到文件
-n:指定次数
# top 常见指令
h 查看帮出
z 高亮显示
1 显示所有CPU的负载
s 设置刷新时间
b 高亮现实处于R状态的进程
M 按内存使用百分比排序输出
P 按CPU使用百分比排序输出
R 对排序进行反转
f 自定义显示字段
k kill掉指定PID进程
W 保存top环境设置 ~/.toprc
q 退出
3. 什么是中断
- 中断是系统用来影响硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来影响设备的请求。
四、系统平均负载
平均负载是指,单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数
1. 平均负载值
## 平均负载多少合理?
假设现在在4,2,1核的CPU上,如果平均负载为2时,意味着什么呢?
| 核心数 | 平均负载 | 含义 |
| ------ | -------- | ---------------------------- |
| 4 | 2 | 有一半(50%)的CPU是空闲状态 |
| 2 | 2 | CPU刚好完全被占用 |
| 1 | 2 | 至少一半的进程是抢不到CPU |
### 平均负载的三个数值我们该关注哪一个
**1.如果1分钟,5分钟,15分钟的负载数值相差不大,代表系统的负载很''稳定''**
**2.如果1分钟的值,远小于15分钟的值,那么证明系统的平均负载逐渐降低,但是15分钟区间,系统负载上升的原因需要知道**
**3.如果15分钟的值,远小于1分钟的值,那么证明系统的平均负载逐渐升高,有可能是临时的也有可能持续上升,需要观察**
**4.一旦1分钟的平均负载接近或超过了CPU的个数,就意味着,系统正在发生过载的问题,这时候就得分析问题了,并且要想办法优化。**
2. 平均负载实验
`stress`是Linux系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景。
`mpstat`是多核CPU性能分析工具,用来实时检查每个CPU的性能指标,以及所有CPU的平均指标。
`pidstat`是一个常用的进程性能分析工具,用来实时查看进程的CPU,内存,IO,以及上下文切换等性能指标。
**场景1:**4个CPU跑满
====================
[root@qls ~]# stress --cpu 4 --timeout 600
# watch
-d:变化部分高亮显示
# 5秒钟检测一次所有指标
[root@qls ~]# mpstat -P ALL 5
# 5秒输出一组数据
[root@qls ~]# pidstat -u 5 1
**总结:**
=========
1.平均负载高有可能是CPU密集型进程导致的
2.平均负载高并不一定代表CPU的使用率就一定高,还有可能是I/O繁忙
3.当发现负载高时,可以使用mpstat、pidstat等工具,快速定位到,负载高的原因,从而做出处理
五、开机启动流程
1. CentOS6启动
1.内核引导
2.运行init
init 在CentOS中,是系统所有进程的起点,如果进程想启动,那必须有init,如果没有init,系统中的任何进程都不会启动,那就相当于这个系统打不开...所以init才是爸爸。
3.系统初始化
4.建立终端
5.用户登录
## 关机命令
init 0
halt
shutdown -h now
shutdown -h 20:20
shutdown -h +10
poweroff
## 重启命令
init 6
reboot
shutdown -r now
shutdonw -r 20:20
shutdown -r +10
2. 七个运行级别:
## 关机
0 - halt (Do NOT set initdefault to this)
## 单用户模式
1 - Single user mode
## 多用户模式(没有文件系统和网络)
2 - Multiuser, without NFS (The same as 3, if you do not have networking)
## 完整的多用户模式(命令行)
3 - Full multiuser mode
## 没有被使用级别
4 - unused
## 图形化界面
5 - X11
## 重启
6 - reboot (Do NOT set initdefault to this)
3. CentOS7开机启动
1.BIOS(开机自检)
2.MBR ( Master Boot Record 主引导记录)
3.GRUB2 Bootloader(引导菜单)
4.Kernel(内核引导)
5.Systemd (不再使用init,改成了systemd)
6.Runlevel-Target (运行级别)
运行级别:
init 0.target -> poweroff.target # 关机
init 1.target -> rescue.target # 单用户模式
init 2.target -> multi-user.target # 多用户模式(没有文件系统和网络)
init 3.target -> multi-user.target # 多用户模式(命令行)
init 4.target -> multi-user.target # 多用户模式(还是没有被使用)
init 5.target -> graphical.target # 图形化模式
init 6.target -> reboot.target # 重启
# 获取当前默认的运行级别
[root@qls ~]# systemctl get-default
multi-user.target
# 修改运行级别
[root@qls ~]# systemctl set-default poweroff
## 使用两条命令修改默认运行级别
[root@qls ~]# rm -f /etc/systemd/system/default.target
[root@qls ~]# ln -s /usr/lib/systemd/system/poweroff.target /etc/systemd/system/default.target
## 相关目录
[root@qls ~]# ll /etc/systemd/system (默认的运行级别)
[root@qls ~]# ll /usr/lib/systemd/system (运行级别和服务启动脚本)
4. CentOS7单用户模式
- 生产中可以用于密码忘却修改等的实现。
在linux16 行末,加上:enforcing=0 init=/bin/bash
修改完之后,按Ctrl + X
## 修改默认启动方式
bash-4.2# mount -o rw,remount /
bash-4.2# systectl set-default(不能用)
bash-4.2# rm -f /etc/systemd/system/default.target
bash-4.2# ln -s /usr/lib/systemd/system/multi-user.target /etc/systemd/system/default.target
bash-4.2# exec /sbin/init
## 修改密码
bash-4.2# mount -o rw,remount /
bash-4.2# echo 123|passwd --stdin root
bash-4.2# exec /sbin/init
方法2:
switch_root:/# mount -o rw,remount /sysroot
switch_root:/# chroot /sysroot
sh-4.2# systemctl set-default multi-user.target
sh-4.2# exit
switch_root:/# reboot
5.企业救援案例
案例一:忘记root密码
**救援模式: **
- 1.将光驱中放入镜像,然后连接
- 2.打开电源进入BIOS(右键单击——电源——打开电源时进入固件)
- 3.选择boot界面,右键到boot——选择CD-ROM使用+跳到最上面
- 4.保存退出,选择Exit——Exit Saving Changes——回车两次
- 5.进入救援模式Troubleshooting
- 6.进入救援模式Rescue a Centos system
- 7.进入救援模式之后,选择继续,按1
- 8.直接回车
- 9.获取root的环境变量,修改密码
输入:chroot /mnt/sysimage回车
输入:echo 22 | passwd --stdin root回车
输入:exit回车
输入:reboot回车
# 使用init /bin/bash
==============
开机按e进入单用户模式,然后ro改为rw,输入:enforcing=0 init=/bin/bash
ctrl+x进入单用户模式
bash-4.2# mount -o rw,remount /
bash-4.2# echo 123|passwd --stdin root
bash-4.2# exec /sbin/init
# 使用 rd.break
==============
开机按e进入单用户模式,然后ro改为rw,输入:rd.break
ctrl+x进入单用户模式
switch_root:/# mount -o rw,remount /sysroot
switch_root:/# chroot /sysroot
sh-4.2# echo 123|passwd --stdin root
sh-4.2# exit
switch_root:/# reboot
案例二:修改运行级别为poweroff/reboot
- 使用init /bin/bash(只能使用ln -s)
开机按e进入单用户模式,然后ro改为rw,输入:enforcing=0 init=/bin/bash
ctrl+x进入单用户模式
bash-4.2# mount -o rw,remount /sysroot/
sh-4.2# systemctl set-default multi-user.target
sh-4.2# exit
switch_root:/# reboot
- 使用 rd.break(systemd)
开机按e进入单用户模式,然后ro改为rw,输入:rd.break
ctrl+x进入单用户模式
switch_root:/# mount -o rw,remount /sysroot
switch_root:/# chroot /sysroot
bash-4.2# rm -f /etc/systemd/system/default.target
bash-4.2# ln -s /usr/lib/systemd/system/multi-user.target /etc/systemd/system/default.target
bash-4.2# exet
- 救援模式
进入命令
sh-4.2# chroot /mnt/sysimage
sh-4.2# systemctl set-default multi-user.target
sh-4.2# exit
sh-4.2# root
案例三:误损坏MBR
搭建环境:
输入:dd < /dev/zero >/dev/sda bs=1 count=446
重启确认:找不到操作系统
进入救援模式修复(进入方法与场景一一致)
获取root权限
sh-4.2# chroot /mnt/sysimage
修复
bash-4.2# grub2-install /dev/sda
退出
bash-4.2# exit
重启
sh-4.2# reboot
案例四:误删除GRUB菜单
搭建环境
[root@qls ~]# rm -fr /boot/grub2/
[root@qls ~]# reboot
进入救援模式修复(进入方法与场景一一致)
sh-4.2# chroot /mnt/sysimage
bash-4.2# grub2-install /dev/sda
bash-4.2# grub2-mkconfig -o /boot/grub2/grub.cfg
bash-4.2# exit
sh-4.2# reboot