一、 自定義寫(xiě)出10個(gè)定時(shí)任務(wù)的示例:比如每周三凌晨三點(diǎn)執(zhí)行date命令要求盡量的覆蓋各種場(chǎng)景
[11:07:55 root@rocky8 data]#crontab -e #創(chuàng)建任務(wù)
crontab: installing new crontab
[11:32:22 root@rocky8 data]#crontab -l #查看任務(wù)
#PATH變量補(bǔ)全
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#每周三凌晨三點(diǎn)執(zhí)行date命令寫(xiě)入a.txt
0 3 * * 3 date >> /data/a.txt
#每三個(gè)小時(shí)執(zhí)行一次echo寫(xiě)到a.txt
0 */3 * * * echo "三個(gè)小時(shí)過(guò)去了" >> a.txt
#每小時(shí)的第一分鐘執(zhí)行一次echo寫(xiě)入到a.txt
1 * * * * echo "每小時(shí)的第一分鐘" >> a.txt
#每個(gè)月的20到25號(hào)或者每周的周一周五執(zhí)行一次echo寫(xiě)入到a.txt
* * 20-25 * 1,5 echo "這是每個(gè)月的20-25號(hào),或者是周一,周五" >> a.txt
#11月每天的6-12點(diǎn)之間每隔兩小時(shí)執(zhí)行/app/bin/test.sh
0 6-12/2 * 11 * /app/bin/test.sh
#在每天的5,7,9,11點(diǎn)整執(zhí)行
0 5,7,9,11 * * * /app/bin/test.sh
二、圖文并茂說(shuō)明Linux進(jìn)程和內(nèi)存概念
進(jìn)程
Process: 運(yùn)行中的程序的一個(gè)副本,是被載入內(nèi)存的一個(gè)指令集合,是資源分配的單位
- 進(jìn)程ID(Process ID,PID)號(hào)碼被用來(lái)標(biāo)記各個(gè)進(jìn)程
- UID、GID、和SELinux語(yǔ)境決定對(duì)文件系統(tǒng)的存取和訪問(wèn)權(quán)限
- 通常從執(zhí)行進(jìn)程的用戶來(lái)繼承
- 存在生命周期
進(jìn)程創(chuàng)建:
- init:第一個(gè)進(jìn)程,從 CentOS7 以后為systemd
- 進(jìn)程:都由其父進(jìn)程創(chuàng)建,fork(),父子關(guān)系,CoW:Copy On Write
進(jìn)程和線程的關(guān)系

進(jìn)程
進(jìn)程是一個(gè)具有一定獨(dú)立功能的程序在一個(gè)數(shù)據(jù)集上的一次動(dòng)態(tài)執(zhí)行的過(guò)程,是操作系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位,是應(yīng)用程序運(yùn)行的載體。進(jìn)程是一種抽象的概念,從來(lái)沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)定義。
進(jìn)程的組成進(jìn)程一般由程序、數(shù)據(jù)集合和進(jìn)程控制塊三部分組成。
程序用于描述進(jìn)程要完成的功能,是控制進(jìn)程執(zhí)行的指令集;數(shù)據(jù)集合是程序在執(zhí)行時(shí)所需要的數(shù)據(jù)和工作區(qū);程序控制塊(Program Control Block,簡(jiǎn)稱PCB),包含進(jìn)程的描述信息和控制信息,是進(jìn)程存在的唯一標(biāo)志。進(jìn)程具有的特征:
動(dòng)態(tài)性:進(jìn)程是程序的一次執(zhí)行過(guò)程,是臨時(shí)的,有生命期的,是動(dòng)態(tài)產(chǎn)生,動(dòng)態(tài)消亡的;
并發(fā)性:任何進(jìn)程都可以同其他進(jìn)程一起并發(fā)執(zhí)行;
獨(dú)立性:進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位;
結(jié)構(gòu)性:進(jìn)程由程序、數(shù)據(jù)和進(jìn)程控制塊三部分組成。
線程
在早期的操作系統(tǒng)中并沒(méi)有線程的概念,進(jìn)程是能擁有資源和獨(dú)立運(yùn)行的最小單位,也是程序執(zhí)行的最小單
位。任務(wù)調(diào)度采用的是時(shí)間片輪轉(zhuǎn)的搶占式調(diào)度方式,而進(jìn)程是任務(wù)調(diào)度的最小單位,每個(gè)進(jìn)程有各自獨(dú)立的一塊內(nèi)存,使得各個(gè)進(jìn)程之間內(nèi)存地址相互隔離。
后來(lái),隨著計(jì)算機(jī)的發(fā)展,對(duì)CPU的要求越來(lái)越高,進(jìn)程之間的切換開(kāi)銷(xiāo)較大,已經(jīng)無(wú)法滿足越來(lái)越復(fù)雜的程序的要求了。于是就發(fā)明了線程。
線程是程序執(zhí)行中一個(gè)單一的順序控制流程,是程序執(zhí)行流的最小單元,是處理器調(diào)度和分派的基本單位。一個(gè)進(jìn)程可以有一個(gè)或多個(gè)線程,各個(gè)線程之間共享程序的內(nèi)存空間(也就是所在進(jìn)程的內(nèi)存空間)。一個(gè)標(biāo)準(zhǔn)的線程由線程ID、當(dāng)前指令指針(PC)、寄存器和堆棧組成。而進(jìn)程由內(nèi)存空間(代碼、數(shù)據(jù)、進(jìn)程空間、打開(kāi)的文件)和一個(gè)或多個(gè)線程組成。
進(jìn)程和線程的區(qū)別
線程是程序執(zhí)行的最小單位,而進(jìn)程是操作系統(tǒng)分配資源的最小單位;
一個(gè)進(jìn)程由一個(gè)或多個(gè)線程組成,線程是一個(gè)進(jìn)程中代碼的不同執(zhí)行路線;
進(jìn)程之間相互獨(dú)立,但同一進(jìn)程下的各個(gè)線程之間共享程序的內(nèi)存空間(包括代碼段、數(shù)據(jù)集、堆等)及一些進(jìn)
程級(jí)的資源(如打開(kāi)文件和信號(hào)),某進(jìn)程內(nèi)的線程在其它進(jìn)程不可見(jiàn);
調(diào)度和切換:線程上下文切換比進(jìn)程上下文切換要快得多。
查看進(jìn)程樹(shù)
[11:49:15 root@rocky8 data]#pstree -p
systemd(1)─┬─NetworkManager(1003)─┬─{NetworkManager}(1025) #帶{}的是線程 不帶的是進(jìn)程
│ └─{NetworkManager}(1027)
├─VGAuthService(997)
├─agetty(1314)
├─atd(1306)
├─auditd(975)───{auditd}(976)
├─automount(1262)─┬─{automount}(1309)
│ ├─{automount}(1310)
│ ├─{automount}(1311)
│ ├─{automount}(1323)
│ └─{automount}(1326)
├─chronyd(1009)
├─crond(1300)
├─dbus-daemon(1002)
├─irqbalance(1001)───{irqbalance}(1004)
├─polkitd(1000)─┬─{polkitd}(1070)
│ ├─{polkitd}(1071)
│ ├─{polkitd}(1087)
│ ├─{polkitd}(1088)
│ └─{polkitd}(1247)
├─rsyslogd(1135)─┬─{rsyslogd}(1229)
│ └─{rsyslogd}(1237)
├─sshd(1031)─┬─sshd(1709)───sshd(1711)───bash(1712)───pstree(2055)
│ └─sshd(1783)───sshd(1785)───bash(1786)
├─sssd(999)─┬─sssd_be(1038)
│ └─sssd_nss(1103)
├─systemd(1659)───(sd-pam)(1661)
├─systemd-journal(840)
├─systemd-logind(1246)
├─systemd-udevd(880)
├─tuned(1032)─┬─{tuned}(1637)
│ ├─{tuned}(1645)
│ ├─{tuned}(1646)
│ └─{tuned}(1647)
└─vmtoolsd(998)─┬─{vmtoolsd}(1020)
├─{vmtoolsd}(1021)
└─{vmtoolsd}(1081)
用戶和內(nèi)核空間

三、圖文并茂說(shuō)明Linux啟動(dòng)流程
POST--GRUB1階段MBR446--GRUB1.5MBR之后的空間(提供grub2文件所有分區(qū)的文件系統(tǒng))--GRUB2階段(grub.conf)--kernel(initramfs.img)--根分區(qū)--/sbin/init--/etc/inittab--/etc/rc.sysinit--/etc/rc.d/rc--/etc/rcN.d/K,S(/etc/init.d/)--/etc/rc.local--login登錄
CentOS6的啟動(dòng)流程

- 加載BIOS的硬件信息,獲取第一個(gè)啟動(dòng)設(shè)備
- 讀取第一個(gè)啟動(dòng)設(shè)備MBR的引導(dǎo)加載程序(grub)的啟動(dòng)信息
- 加載核心操作系統(tǒng)的核心信息,核心開(kāi)始解壓縮,并嘗試驅(qū)動(dòng)所有的硬件設(shè)備
- 核心執(zhí)行init程序,并獲取默認(rèn)的運(yùn)行信息
- init程序執(zhí)行/etc/rc.d/rc.sysinit文件,重新掛載根文件系統(tǒng)
- 啟動(dòng)核心的外掛模塊
- init執(zhí)行運(yùn)行的各個(gè)批處理文件(scripts)
- init執(zhí)行/etc/rc.d/rc.local
- 執(zhí)行/bin/login程序,等待用戶登錄
- 登錄之后開(kāi)始以Shell控制主
CentOS7之后的啟動(dòng)流程
- UEFi或BIOS初始化,運(yùn)行POST開(kāi)機(jī)自檢
- 選擇啟動(dòng)設(shè)備
- 引導(dǎo)裝載程序, centos7是grub2,加載裝載程序的配置文件:
/etc/grub.d/
/etc/default/grub
/boot/grub2/grub.cfg- 加載initramfs驅(qū)動(dòng)模塊
- 加載內(nèi)核選項(xiàng)
- 內(nèi)核初始化,centos7使用systemd代替init
- 執(zhí)行initrd.target所有單元,包括掛載/etc/fstab
- 從initramfs根文件系統(tǒng)切換到磁盤(pán)根目錄
- systemd執(zhí)行默認(rèn)target配置,配置文件/etc/systemd/system/default.target
- systemd執(zhí)行sysinit.target初始化系統(tǒng)及basic.target準(zhǔn)備操作系統(tǒng)
- systemd啟動(dòng)multi-user.target下的本機(jī)與服務(wù)器服務(wù)
- systemd執(zhí)行multi-user.target下的/etc/rc.d/rc.local
- Systemd執(zhí)行multi-user.target下的getty.target及登錄服務(wù)
- systemd執(zhí)行g(shù)raphical需要的服務(wù)

四、 自定義一個(gè)systemd服務(wù)定時(shí)去其他服務(wù)器上檢查/tmp/下文件的個(gè)數(shù),如果發(fā)現(xiàn)數(shù)量有變化就記錄變化情況到文件中。
先對(duì)目標(biāo)服務(wù)器進(jìn)行key驗(yàn)證登錄然后再對(duì)目錄進(jìn)行數(shù)量統(tǒng)計(jì)
1 #!/bin/bash
2 ssh_login(){
3 PASS=
4 rpm -q expect &> /dev/null || yum -y install expect &> /dev/null
5 if [ ! -e /root/.ssh/id_rsa ];then
6 ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa &> /dev/null
7 echo "ssh key is created"
8 fi
9 while read IP ;do
10 expect &> /dev/null <<EOF
11 set timeout 20
12 spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$IP
13 expect {
14 "yes/no" { send "yes\n";exp_continue }
15 "password" { send "$PASS\n" }
16 }
17 expect eof
18 EOF
19 echo $IP is ready
20 done < /root/hosts.txt
21 }
22
23 check(){
24 ssh 10.0.0.8 <<execute
25 check_file(){
26 i=0
27 if [ i=0 ]; then
28 NUM=`ls /tmp/ |wc -w`
29 ll /tmp/ > `date "+%Y-%m-%d_%H:%M:%S"`.txt
30 fi
31 if [[ `ls /tmp/ |wc -w` != $NUM ]]; then
32 ll /tmp/ > `date "+%Y-%m-%d_%H:%M:%S"`.txt
33 fi
34 i=$i+1
35 }
36 check_file
37 echo "完畢"
38 exit
39 execute
40 }
41 ssh_login
42 check
編寫(xiě)和開(kāi)啟服務(wù)
[16:44:04 root@rocky8 ~]#systemctl enable --now test
[16:44:06 root@rocky8 ~]#systemctl status test
● test.service - check_file_num
Loaded: loaded (/usr/lib/systemd/system/test.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Sun 2023-07-30 16:44:07 CST; 1s ago
Process: 10367 ExecStart=/root/test.sh (code=exited, status=0/SUCCESS)
Main PID: 10367 (code=exited, status=0/SUCCESS)
7月 30 16:44:06 rocky8.mazhuobo systemd[1]: Started check_file_num.
7月 30 16:44:07 rocky8.mazhuobo test.sh[10367]: 10.0.0.8 is ready
7月 30 16:44:07 rocky8.mazhuobo systemd[1]: test.service: Succeeded.
編寫(xiě)定時(shí)任務(wù)
#PATH變量補(bǔ)全
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#每10分鐘查看一下數(shù)量
* */10 * * * bash /root/test.sh
五、總結(jié)5個(gè)自我覺(jué)得比較有用的awk的使用場(chǎng)景,比如在什么情況下用awk處理文本效率最高,發(fā)散題,至少寫(xiě)1個(gè)。
1、用NR獲取IP地址
[17:38:06 root@rocky8 ~]#ifconfig eth0 | awk 'NR==2{print $2}'
10.0.0.8
2、用NF獲取磁盤(pán)利用率
[17:43:55 root@rocky8 ~]#df | awk -F"[ %]+" '/^\/dev/{print $(NF-1)}'
5
1
21
3、對(duì)數(shù)字進(jìn)行計(jì)算
[17:52:53 root@rocky8 ~]#cat abc.txt
1 2 3 4 5
[17:52:59 root@rocky8 ~]#cat abc.txt |awk '{for(i=1;i<=NF;i++){sum+=i};print sum}'
15
4、制作表格
18:02:57 root@rocky8 ~]#awk -F: 'BEGIN{printf "--------------------------------------\n%-20s|%10s|\n--------------------------------------\n","username","uid"}{printf"%-20s|%10d|\n",$1,$3}' /etc/passwd
--------------------------------------
username | uid|
--------------------------------------
root | 0|
bin | 1|
daemon | 2|
adm | 3|
lp | 4|
sync | 5|
shutdown | 6|
halt | 7|
mail | 8|
operator | 11|
games | 12|
ftp | 14|
nobody | 65534|
dbus | 81|
systemd-coredump | 999|
systemd-resolve | 193|
tss | 59|
polkitd | 998|
unbound | 997|
sssd | 996|
sshd | 74|
ma | 1000|
postfix | 89|
chrony | 995|
tcpdump | 72|
5、計(jì)算文件類(lèi)型的出現(xiàn)的次數(shù)
[18:13:02 root@rocky8 ~]#awk -F' +' '/^[^#]/{fs[$3]++}END{for(i in fs){print i,fs[i]}}' /etc/fstab
swap 1
xfs 3