1. 自定义写出几个定时任务的示例:
#比如每周三凌晨三点执行data命令
0 3 * * 3 root user data
#晚上9点10分运行echo命令,输出信息仍会发送到root 邮箱
10 21 * * * user echo "xixi" | mail -s "haha" root
#每3小时echo和wall命令
* */ * * * user echo "xixi" ; wall "hhhhh"
#11月每天的6-12点之间每隔2小时执行/app/bin/test.sh
* 6-12/2 * 11 * user /app/bin/test.sh
#每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式为“etcbak-yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的时间
30 13 * * 1-5 cp -a /etc /backup/"etcbak-$(date -d yesterday +%Y-%m-%d-%H).tar.xz"
#每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
* */2 * * * cat /proc/meminfo | awk '/^[SM]/ {print}' >> /tmp/meminfo.txt
#工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高于80%,就执行wall警报
*/10 * * * 1-5 df -h | awk 'NR>1 && $5+0 > 80' | wall
2. Linux进程和内存概念
进程的基本状态
- 创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
- 就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
- 执行状态:进程处于就绪状态被调度后,进程进入执行状态
- 阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
- 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行
进程更多的状态:
- 运行态:running
- 就绪态:ready
- 睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable
- 停止态:stopped,暂停于内存,但不会被调度,除非手动启动
- 僵尸进程:进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程。
- 孤儿进程:父进程运行结束,但子进程还在运行(未运行结束)的子进程
内存:是运行进程的空间,CPU待处理的数据和运行的程序暂时存储的空间
进程和线程的区别
线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;
3. Linux启动流程
CentOS6启动过程总结
- POST
- GRUB1阶段MBR446
- GRUB1.5MBR之后的空间(提供grub2文件所有分区的文件系统)
- GRUB2阶段(grub.conf)
- kernel(initramfs.img)
- 根分区
- /sbin/init
- /etc/inittab
- /etc/rc.sysinit
- /etc/rc.d/rc
- /etc/rcN.d/K,S(/etc/init.d/)
- /etc/rc.local
- login登录
CentOS7启动过程总结
- UEFi或BIOS初始化,运行POST开机自检
- 选择启动设备
- 引导装载程序, centos7是grub2,加载装载程序的配置文件:/etc/grub.d/ ,/etc/default/grub ,/boot/grub2/grub.cfg
- 加载initramfs驱动模块
- 加载内核选项
- 内核初始化,centos7使用systemd代替init
- 执行initrd.target所有单元,包括挂载/etc/fstab
- 从initramfs根文件系统切换到磁盘根目录
- systemd执行默认target配置,配置文件/etc/systemd/system/default.target
- systemd执行sysinit.target初始化系统及basic.target准备操作系统
- systemd启动multi-user.target下的本机与服务器服务
- systemd执行multi-user.target下的/etc/rc.d/rc.local
- Systemd执行multi-user.target下的getty.target及登录服务
- systemd执行graphical需要的服务
简述Linux启动过程?
- 开机BIOS自检,加载硬盘。
- 读取MBR,MBR引导。
- grub引导菜单(Boot Loader)。
- 加载内核kernel。
- 启动init进程,依据inittab文件设定运行级别。
- init进程,执行rc.sysinit文件。
- 启动内核模块,执行不同级别的脚本程序。
- 执行/etc/rc.d/rc.local。
- 启动tty,进入系统登陆界面。
4. 写Linux内核编译安装博客
下载Linux内核 www.kernel.org/
将下载的内核包上传到Linux
安装软件包:
yum -y install gcc make ncurses-devel flex bison openssl-devel elfutils-libelf-devel bc perl
解压Linux内核源代码:
tar xf linux-5.18.9.tar.xz -C /usr/local/src
进入Linux内核源代码目录:
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 # 更改内核版本名称
这里列出了三行配置项。第一行CONFIG_MODULE_SIG=y被注释掉,意味着该功能将被禁用。第二行CONFIG_SYSTEM_TRUSTED_KEYS=""被修改为空字符串,可能是为了清除之前的信任密钥配置。第三行CONFIG_DEBUG_INFO_BTF=y的配置被更改为启用某个内核版本名称(此处并没有给出具体的名称)。
使用make命令编译内核模块:
make modules_install
使用make命令安装内核:
make install
重新启动系统:
reboot
5. 总结5个自我觉得比较有用的awk的使用场景,比如在什么情况下用awk处理文本效率最高,发散题,至少写1个。
AWK的工作流程
1.通过关键字 BEGIN 执行 BEGIN 块的内容,即 BEGIN 后花括号 {} 的内容。
2.完成 BEGIN 块的执行,开始执行body块。
3.读入有 \n 换行符分割的记录。
4.将记录按指定的域分隔符划分域,填充域,1 表示第一个域,$n 表示第 n 个域。
5.依次执行各 BODY 块,pattern 部分匹配该行内容成功后,才会执行 awk-commands 的内容。
6.循环读取并执行各行直到文件结束,完成body块执行。
7.开始 END 块执行,END 块可以输出最终结果。
当使用awk处理文本时,你可以根据不同的使用场景来编写相应的awk命令。以下是五个实际的awk命令示例:
1.数据提取与报告生成: 从访问日志中提取IP地址和访问时间,并生成包含这些信息的报告。
awk '{print "IP: " $1 ", Access Time: " $4}' access.log
2.数据格式转换: 将以制表符分隔的数据转换为CSV格式,以便在电子表格中打开和编辑。
awk 'BEGIN{FS="\t"; OFS=","} {$1=$1} 1' data.tsv > data.csv
3.文本过滤与搜索: 从大型配置文件中过滤出特定服务的配置信息,例如从/etc/ssh/sshd_config文件中提取SSH服务的配置。
awk '/^#?Port/ {print}' /etc/ssh/sshd_config
4.统计和计算: 计算日志文件中不同HTTP请求的数量,例如统计GET请求和POST请求的次数。
awk '/GET/ {getCount++} /POST/ {postCount++} END {print "GET requests: " getCount ", POST requests: " postCount}' access.log
5.数据预处理: 对原始数据进行清洗和规范化,例如去除重复行、空行或不必要的空格。
awk '!seen[$0]++' data.txt > cleaned_data.txt