0
点赞
收藏
分享

微信扫一扫

第四周作业2022-12-12

一、自定义写出10个定时任务的示例:比如每周三凌晨三点执行data命令,要求尽量的覆盖各种场景

0 3 * * 3  data                                 #每周三凌晨三点执行data命令 
30 1 * * * /backup #每周工作日1:30,执行/backup 30 1 * * * /backup
/proc/meminfo * */2 * * * /proc/meminfo #每两小时取出当前系统
0 20 1,10,22 * * systemctl restart httpd #每月1、10、22日的20:00重启apache
30 23 20 * * /tmp/test.sh #每月20号的23:30执行/tmp下的test.sh脚本
0 5-11/2 * * * cat /dev/null > /var/www/html #早上5点到晚上11点之间,每隔2个小时清理/var/www/html目录一次
0 4 1 * * systemctl restart httpd #每月1号的4点重启http服务
30 8-18/2 * * * date #每天早上8点到下午18点每隔2小时的每30分钟 查看系统时间
30 3,12 * * * /tmp/hello.sh #每天3点30分和12点30分执行/tmp下的hello.sh脚本
30 23 30 12 * reboot #12月30号23:30分重启主机

二、图文并茂说明Linux进程和内存概念

常见的优化思路有这么几种:

1)最好禁止 Swap。如果必须开启 Swap,降低 swappiness 的值,减少内存回收时 Swap 的使用倾向。

2)减少内存的动态分配。比如,可以使用内存池、大页(HugePage)等。

3)尽量使用缓存和缓冲区来访问数据。比如,可以使用堆栈明确声明内存空间,来存储需要缓存的数据;或者用Redis 这类的外部缓存组件,优化数据的访问。

4)使用 cgroups 等方式限制进程的内存使用情况。这样,可以确保系统内存不会被异常进程耗尽。

5)通过 /proc/pid/oom_adj ,调整核心应用的 oom_score。这样,可以保证即使内存紧张,核心应用也不会被 OOM杀死。

第四周作业2022-12-12_bc


进程:将程序动态的运行起来,就转成进程,(即程序的执行过程)过程: 包含进程的创建,进程的运行以及进程消亡。

进程一般由程序、数据集合和进程控制块三部分组成。

进程一般包含两种,前台进程和后台进程。内存:是运行进程的空间,CPU待处理的数据和运行的程序暂时存储的空间。

第四周作业2022-12-12_bc_02

进程与线程的区别

线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;调度和切换:线程上下文切换比进程上下文切换要快得多。


pmap 33477 #内存OOM看哪个组件占的内存多
33477: ping 127.0.0.1
000055f708aa7000 56K r-x-- ping
000055f708cb5000 4K r---- ping
000055f708cb6000 4K rw— ping
000055f708cb7000 140K rw— [ anon ]
000055f70a7cc000 132K rw— [ anon ]
00007fe73fb13000 2528K r---- LC_COLLATE
00007fe73fd8b000 108K r-x-- libpthread-2.28.so
00007fe73fda6000 2044K ----- libpthread-2.28.so
00007fe73ffa5000 4K r---- libpthread-2.28.so
00007fe73ffa6000 4K rw— libpthread-2.28.so
00007fe73ffa7000 16K rw— [ anon ]
00007fe73ffab000 12K r-x-- libdl-2.28.so
00007fe73ffae000 2044K ----- libdl-2.28.so
00007fe7401ad000 4K r---- libdl-2.28.so
00007fe7401ae000 4K rw— libdl-2.28.so
00007fe7401af000 88K r-x-- libz.so.1.2.11
00007fe7401c5000 2044K ----- libz.so.1.2.11

三、图文并茂说明Linux启动流程

第四周作业2022-12-12_加载_03

启动加载器 bootloader

grub 功能和组成

bootloader: 引导加载器,引导程序

Windows: ntloader,仅是启动OS

Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核

Linux的bootloader

LILO:LInux LOader,早期的bootloader,功能单一

GRUB: GRand Unified Bootloader, CentOS 5,6 GRUB 0.97: GRUB Legacy, CentOS 7 以后使用GRUB 2.02

GRUB 启动阶段

primary boot loader :

1st stage:MBR的前446个字节(放不了文件系统的驱动,因为没进操作系统)

1.5 stage:MBR 之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统

secondary boot loader :2nd stage,分区文件/boot/grub/

第四周作业2022-12-12_启动流程_04

CentOS6启动流程

(1) 加载BIOS的硬件信息,获取第一个启动设备

(2) 读取第一个启动设备MBR的引导加载程序(grub)的启动信息

(3) 加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备

(4) 核心执行init程序,并获取默认的运行信息

(5)init程序执行/etc/rc.d/rc.sysinit文件,重新挂载根文件系统

(6)启动核心的外挂模块

(7)init执行运行的各个批处理文件(scripts)

(8) init执行/etc/rc.d/rc.local

(9)执行/bin/login程序,等待用户登录

(10)登录之后开始以Shell控制主机

系统初始化脚本功能(/etc/rc.d/rc.sysinit)

(1) 设置主机名

(2) 设置欢迎信息

(3) 激活udev和selinux

(4) 挂载/etc/fstab文件中定义的文件系统

(5) 检测根文件系统,并以读写方式重新挂载根文件系统

(6) 设置系统时钟

(7) 激活swap设备

(8) 根据/etc/sysctl.conf文件设置内核参数

(9) 激活lvm及software raid设备

(10)加载额外设备的驱动程序

(11)清理操作

CentOS7以后启动流程 

(1) UEFi或BIOS初始化,运行POST开机自检

(2) 选择启动设备

(3) 引导装载程序, centos7是grub2,加载装载程序的配置文件:

/etc/grub.d/

/etc/default/grub

/boot/grub2/grub.cfg

(4) 加载initramfs驱动模块

(5) 加载内核选项

(6)内核初始化,centos7使用systemd代替init

(7) 执行initrd.target所有单元,包括挂载/etc/fstab

(8) 从initramfs根文件系统切换到磁盘根目录

(9) systemd执行默认target配置,配置文件/etc/systemd/system/default.target

(10)systemd执行sysinit.target初始化系统及basic.target准备操作系统

(11) systemd启动multi-user.target下的本机与服务器服务

(12) systemd执行multi-user.target下的/etc/rc.d/rc.local

(13) Systemd执行multi-user.target下的getty.target及登录服务

(14)systemd执行graphical需要的服务


和运行级别对应关系(target=runlevel)

0 ==> runlevel0.target, poweroff.target

1 ==> runlevel1.target, rescue.target

2 ==> runlevel2.target, multi-user.target

3 ==> runlevel3.target, multi-user.target

4 ==> runlevel4.target, multi-user.target

5 ==> runlevel5.target, graphical.target

6 ==> runlevel6.target, reboot.target

四、自定义一个systemd服务定时去其他服务器上检查/tmp/下文件的个数,如果发现数量有变化就记录变化情况到文件中

vim /lib/systemd/system/find.service
[Unit] Descriptinotallow=check tmp
[Service] TimeoutStartSec=0
ExecStart=/bin/sh -c "ssh root@192.168.100.10 sh /shell/check_tmp.sh" #基于key验证 ExecStop=ps auxf | grep [check]_tmp.sh |awk '{print $2}' |xargs kill -9 2>/dev/null ExecReload=/bin/kill -s HUP $MAINPID
[Install]
Wantedby=multi-user.target
systemctl daemon-reload
systemctl enable --now find.service

五、写Linux内核编译安装博客

#下载linux内核 https://www.kernel.org/
#将下载的内核包上传到linux
yum -y install gcc make ncurses-devel flex bison openssl-devel
elfutils-libelf-devel bc perl
tar xf linux-5.18.9.tar.xz -C /usr/local/src
cd /usr/local/src/linux-5.18.9
cp /boot/config-$(uname -r) .config
vim .config
#修改下面三行
# CONFIG_MODULE_SIG=y #注释此行
CONFIG_SYSTEM_TRUSTED_KEYS="" #修改此行
# CONFIG_DEBUG_INFO_BTF=y #更改内核版本名称make menuconfigGeneral setup ➡️ Local version - append to kernel release ➡️ -m67-magedu ➡️ savemake -j 8 #多少核就写多少,此处很慢
make modules_install
make installreboot

第四周作业2022-12-12_加载_05

六、总结5个自我觉得比较有用的awk的使用场景,比如在什么情况下用awk处理文本效率最高,发散题,至少写1个

#查询登录不成功的主机及次数
lastb |awk '{print $3}'|sort |uniq -c|sort -nr

#查看磁盘使用率
df | sed -rn '/^\/dev\/sd/ s#(\S+\s+){4}(.*)%.*#\2#p'
df | awk -F"[[:space:]]+|%" '$0 ~ /^\/dev/{if($5>70)print $1,$5}'

#连接数最多的前3个IP
ss -nt|awk -F: '{print $(NF-1)}' |awk '/^[0-9]/{print $NF}'| sort |uniq -c |head -n 3

#显示主机的连接状态出现的次数
awk 'NR!=1{print $1}' ss.log |sort |uniq -c

## 文件abc,txt只有一行数字,计算其总和
cat abc.txt
1 2 3 4 5
awk '{for(i=1;i<=NF;i++){sum+=i};print sum}' abc.txt
cat abc.txt|tr ' ' + |bc
sum=0;for i in `cat abc.txt`;do let sum+=$i;done;echo $sum

#每十分钟检查将连接数超过100个以上的IP放入黑名单拒绝访问
LINK=100
while true;do
ss -nt | awk -F"[[:space:]]+|:" '/^ESTAB/{print $(NF-2)}'|sort |uniq - c|while read count ip;do
if [ $count -gt $LINK ];then
iptables -A INPUT -s $ip -j REJECT
fi
done
done

#数组
awk '!line[$0]++' awk_array.txt #去重,逐行对应每个值下标没赋值控制取反就是真就打印,当遇到重复的值下标不为0取反就0,不打印这行。
awk '{ip[$1]++}END{for(i in ip){print ip[i]"\t"i}}' access.log
awk '{ip[$1]++}END{for(i in ip){if(ip[i]>100)print ip[i]"\t"i}}' access.log |sort -k1 -nr |head -5
#封掉查看访问日志中连接次数超过1000次的IP
awk '{ip[$1]++}END{for(i in ip){if(ip[i]>=1000) {system("iptables -A INPUT -s "i" -j REJECT

awk函数

length([s]):返回指定字符串的长度
sub(r,s,[t]):对t字符串搜索r表示模式匹配的内容,并将第一个匹配内容替换为s
gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容
split(s,array,[r]):以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中,第
一个索引值为1,第二个索引值为2,…

lastb   |awk  '{print $3}' |  sort | uniq  -c | sort - nr       #查询登录不成功的主机及次数



举报

相关推荐

0 条评论