目录
1. 自定义写出10个定时任务的示例:比如每周三凌晨三点执行data命令,要求尽量的覆盖各种场景
4. 自定义一个systemd服务定时去其他服务器上检查/tmp/下文件的个数,如果发现数量有变化就记录变化情况到文件中。
6. 总结5个自我觉得比较有用的awk的使用场景,比如在什么情况下用awk处理文本效率最高,发散题,至少写1个。
1. 自定义写出10个定时任务的示例:比如每周三凌晨三点执行data命令,要求尽量的覆盖各种场景
#每周工作日1点30到3点30,将/etc备份到/backup目录中,格式是年月日小时,日期是前一天的日期
30 1 * * 1-5 /data/backup.sh
#每两小时取出当前系统/proc/meminfo的S和M开头的信息追加到/tmp/meminfo.txt中
* */2 * * * grep '^[S|M]' /proc/meminfo >> /tmp/meminfo.txt
#工作日时间,每十分钟进行一次磁盘检查,如果磁盘大于80,则报警
*/10 * * * 1-5 /data/disk
#每月5号3点查看系统时间
* 3 * * 5 date
#一月一号四点重启httpd服务
0 4 1 1 * systemctl restart httpd
#每月四号和每周一到周三4点重启服务器
0 11 4 * 1-3 shutdown -r --now
#每周1到周6的3点20把/etc打包到/tmp目录下
20 3 * * 1-6 tar -zcf /tmp/etc.gz /etc
每月1号10号22号3点45分把ip地址追加到/data/ip.txt下
45 3 1,10,22 * * hostname -I >>/data/ip.txt
每天5点到11点每隔一小时删除/var/www/html目录的文件
0 5-11 * * * rm -rf /var/www/html
#每周1到周三8点30分扫描主机端口
30 8 * * * 1-3 /data/scan_hostport.sh
2. 图文并茂说明Linux进程和内存概念
Process:运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位
进程号码(Process ID,PID)用来标记各个进程;
UID、GID、SElinux语境决定文件系统存储和访问权限
通常从执行进程的用户继承;
存在生命周期
进程创建:
init第一个进程,从Centos7以后systemd是第一个进程
进程:都是由父进程创建,fork(),父子关系,CoW,Copy On Write
1、进程具有的特征:
动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
并发性:任何进程都可以同其他进程一起并发执行;
独立性:进程是系统进行资源分配和调度的一个独立单位;
结构性:进程由程序、数据和进程控制块三部分组成。
2、进程与线程的区别:
线程是程序执行的最小单位,进程是操作系统分配资源的最小单位;
一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其他进程不可见;
调度和切换:线程上下文切换比进程上下文切换要快得多。
3、进程的基本状态
创建状态:进程在创建时需要申请一个空白PCB(进程控制块process control block),向其中通信控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法调度运行,把此时进程所处状态称为创建状态
就绪状态:进程已准备好,已分配到所需资源,只要分配到 CPU就能够立即运行
执行状态:进程处于就绪状态被调度后,进程进入执行状态
阻塞状态:正在执行的进程由于某些事件(I/O请求,。申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
终止状态:进程结束,或出现错误,或被系统终止,进入终止状态,无法再执行
内存:是运行进程的空间,CPU待处理的数据和运行的程序暂时存储的空间。
代码段: 用来存放可执行文件的操作指令,也就是说它是可执行程序在内存中的镜像,代码段需要防止在运行时被非法修改,所以只准读取操作,而不允许写入(修改)操作--它是不可写的。
数据段: 用来存放可执行文件中已初始化的全局变量,换句话说就是存放程序静态分配的变量和全局变量
BSS段:Block Started by Symbol 的缩写,意为“以符合开始的块,BSS段包含了程序中未初始化的全局变量,在内存中bss段全部置0
堆(heap): 存放数组和对象,堆是存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
栈(stack): 栈是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的后进先出特点,所以栈特别方便用来保存/恢复调用现场。可以把堆栈看成一个寄存,交换临时数据的分区。
内存泄漏 Memory Leak
指程序中用malloc或new申请了一块内存,但是没有用free或delete将内存释放,导致这块内存一直处于占用状态
内存溢出: Memory Overflow
指程序申请了10M空间,但是在这个空间内写入10M以上的数据,就是溢出
内存不足 : OOM
OOM 即 Out Of Memory "内存用完了",系统会选一个进程将之杀死
3. 图文并茂说明Linux启动流程
centos 6
1.加载BIOS的硬件信息,获取第一个启动设备;
2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息;
GRUB启动阶段:
primary boot loader
1 st stage:MBR前446字节
1.5 stage:MBR之后的扇区,让stage1中的bootloader能识别stage2所在分区上的文件系统;
secondary boot loader :2nd stage,分区文件:/boot/grub/
3.加载kernel,加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备;
kernel自身初始化过程:
(1)探测可识别到的所有硬件设备;
(2)加载硬件驱动程序(借助ramdisk加载驱动)
(3)以只读方式挂载根文件系统
(4)运行用户空间的第一个应用程序: /sbin/init
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控制主机。
Rocky 8.6
按下电源通电
1.UEFI或BIOS初始化,运行POST加电自检
2.选择启动设备(光盘或硬盘),
3.引导装载程序,centos 7是grub2,加载装载程序的配置文件;
/etc/grub.d/
/etc/default/grub
/boot/grub2/grub.cfg
4.加载initramfs驱动模块
5.加载内核
6.内核初始化,centos7使用systemd代替init
启动systemd进程,systemd进程此时工作在initramfs环境下
7systemd执行initrd.target所有单元,包括挂载/etc/fstab,
8.从(ramdisk虚根文件系统)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.启动shell进程并初始化,最终进入命令行
4. 自定义一个systemd服务定时去其他服务器上检查/tmp/下文件的个数,如果发现数量有变化就记录变化情况到文件中。
NU=`ls /tmp/ | wc -l `
while true; do
if [ $NU -gt 8 ];then
echo $NU >> check.txt
fi
sleep 1;
done
~
[Unit]
Description=check tmp
[Service]
TimeoutStartSec=0
ExecStart=/bin/sh -c "ssh [email protected] sh /tmp/check1.sh "
ExecStop=/bin/kill sh
#ExecStop=ps auxf | grep [check].sh | awk '{print $2}' | xargs kill -9
ExecReload=/bin/kill -s -HUP $MAINPID
[Install]
WantedBy=multi-user.target
~
5. 写Linux内核编译安装博客
Ubuntu编译内核
1.在www.kernel.org上选择要下载的内核版本
2.解压
tar -xvf linux-5.19.10.tar.xz -C /usr/src/
3.安装依赖库
apt-get update
apt-get install libncurses5-dev #用于menuconfig
apt-get install build-essential openssl
apt-get intall flex
apt-get intall bison
apt-get intall openssl
apt-get intall libssl-dev
4.配置内核编译参数
cd /usr/src/linux-5.19.10
make mrproper
make clean
make menuconfig
5.编译内核
make bzImage
6.编译和安装modules
make modules
make modules-install
7.安装内核
make install
8.查看和启动新内核
cp /usr/src/linux-5.19.10/arch/x86/boot/bzImage /boot/
cp /usr/src/linux-5.19.10/System.map /boot/
mkinitramfs 5.19.10 -o /boot/initrd.img-5.19.10
update-initramfs -c -k 5.19.10
update-grub2
cd /boot/grub
gedit grub.cfg
cd
grep menuentry /boot/grub/grub.cfg
gedit /etc/default/grub
update-grub
reboot
6. 总结5个自我觉得比较有用的awk的使用场景,比如在什么情况下用awk处理文本效率最高,发散题,至少写1个。
取出分区利用率
[15:38:35 root@Rocky ~]#df | awk -F' +|%' 'NR>=2{print $(NF-2)}'
0
0
1
0
46
32
1
1
0
[16:12:20 root@Rocky ~]#df | awk -F" +|%" '/^\/dev/{print $(NF-2)}'
46
32
1
取出IP地址
[15:40:18 root@Rocky ~]#ifconfig eth0 | awk '/netmask/{print $2}'
10.0.0.128
连接数排序
[16:09:07 root@Rocky ~]#ss -ntl | awk -F" +|:" 'NR>=2 && NR<=6{print $4}' | sort | uniq -c | sort -nr
3 0.0.0.0
1 192.168.122.1
1 127.0.0.1
取出/etc/fstab的文件系统
[16:21:37 root@Rocky ~]#cat /etc/fstab | awk '/^\/dev/{print $3}' |sort | uniq -c | sort -nr
2 xfs
1 swap
取出/etc/fstab每个单词出现的个数
[17:02:41 root@Rocky ~]#awk -F"[^[:alpha:]]" '{for(i=1;i<=NF;i++)word[$i]++}END{for(a in word)if(a !="") print a,word[a]}' /etc/fstab
取出字符串Yd$C@M05MB%9&Bdh5dq+YVixp3vpw的数字
[17:01:09 root@Rocky ~]#echo "Yd$C@M05MB%9&Bdh5dq+YVixp3vpw" | awk '{gsub(/[^0-9]/,"");print $0}'
05953
文件random.txt记录共5000个随机的整数,存储的格式100,50,35,89....请取出其中最大和最小的整数
[17:33:53 root@Rocky ~]#str="";for((i=1;i<=5000;i++));do if [ $i -ne 5000 ];then str+="$RANDOM,";else str+=$RANDOM; fi ; done ;echo $str > random.txt
[17:31:03 root@Rocky ~]#cat random.txt | awk -F, '{max=$1;min=$1;for(i=1;i<=NF;i++){if($i>max){max=$i} else{if($i<min){min=$i}}}}END{print "最大值:"max "最小值:"min}'
最大值:32764最小值:5
将以下内容文件FQDN取出,并根据其计数从大到小排序
http://mail.magedu.com/index.html
http://www.magedu.com/test.html
http://study.magedu.com/index.html
http://blog.magedu.com/index.html
http://www.magedu.com/index.html
http://blog.magedu.com/20080102.html
http://www.magedu.com/images/magedu.jpg
[17:29:15 root@Rocky ~]#cat FQDN.txt | awk -F"/" '{url[$3]++}END{for(a in url)print url[a],a }' | sort -nr
3 www.magedu.com
2 blog.magedu.com
1 study.magedu.com
1 mail.magedu.com
从1加到100求和
[09:48:17 root@Rocky ~]#awk 'BEGIN{i=1;sum=0;while(i<=100){sum+=i;i++}print sum}'
5050