大话Linux——Vim编辑器与Shell编程

简介: ## 4、Vim编辑器与Shell命令脚本4.1、Vim文本编辑器Vim编辑器的三种模式及切换方法命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等输入模式:正常文本录入保存或退出我能当,以及设置编译环境

4、Vim编辑器与Shell命令脚本

4.1、Vim文本编辑器

Vim编辑器的三种模式及切换方法

  • 命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等
  • 输入模式:正常文本录入
  • 保存或退出我能当,以及设置编译环境

1650035750060

  • 命令模式中常用的命令
命令 作用
dd 删除(剪切)光标所在整行
5dd 删除(剪切)从光标处开始的5行
yy 复制光标所在的整行
5yy 复制从光标处开始的5行
n 显示搜索命令定位到的下一个字符
N 显示搜索命令定位到的上一个字符
u 撤销上一步的操作
P 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面
  • 末行模式常用的命令
命令 作用
:w 保存
:q 退出
:q! 强制退出(放弃对文档的修改内容)
:wq! 强制保存退出
:set nu 显示行号
:set nonu 不显示行号
:命令 执行该命令
:整数 跳到该命令
:s/one/two 将当前贯标所在行的第一个one替换成two
:s/one/two/g 将当前贯标所在行的所有的one替换成two
:%s/one/two/g 将全文中的所有的one替换成two
?字符串 在文本中从下至上所搜改字符串
/字符串 在文本中从上至下所搜改字符串

4.1.1、编写简单的文档

给文档取名字:linux.txt,如果存在则打开,否则创建

1650037220807

按a、i、o等键进入输入模式

1650037286261

输入之后按Esc退出

1650037389121

输入:wq!强制保存并退出,使用cat查看内容

1650037490867

1650037534795

在文件中追加语句,并强制退出不保存,使用cat查看

1650037708230

1650037696452

1650037753328

4.1.2、配置主机名称

在Linux系统中,主机名大多保存在/etc/hostname文件中

[root@chenstudy ~]# vim /etc/hostname
chen
# 重启虚拟机之后在进行查看
[root@chen ~]# hostname
chen
[root@chen ~]# 

1650037990875

1650038161208

4.1.3、配置网卡信息

在 Linux 系统中, 一切都是文件,因此配置网络服务的工作其实就是在编辑网卡配置文件

在CentOS7中网卡配置文件的前缀为ifcfg开始

  • 第1步:首先切换到/etc/sysconfig/network-scripts 目录中(存放着网卡的配置文件)
  • 第2步: 编辑器修改网卡文件 ifcfg-en33,逐项写入下面的配置参数并 保存退出。

    • 我之前配置过了所以我的直接显示了IP地址
    • 学习Linux时建议大家配置静态IP,这样我们就可以用finalshell进行连接了
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=cc396254-ae13-43c7-aaec-23b8866d98a1
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.200.130
GATEWAY=192.168.200.2
DNS1=192.168.200.2
# 设备类型:TYPE=Ethernet 
# 地址分配模式:BOOTPROTO=static 
# 网卡名称:NAME=en33
# 是否启动:ONBOOT=yes 
# IP 地址:IPADDR=192.168.200.130
# 网关地址:GATEWAY=192.168.200.2
# DNS 地址:DNS1=192.168.200.2

1650275629807

1650274907448

  • 第3步:重启网络服务并测试网络是否联通。由于在 Linux 系统中 ping 命令不会自动终止,因此需要手动按下 Ctrl-c 键来强行结束进程 。
[root@chen network-scripts]# systemctl restart network
[root@chen network-scripts]# ping 192.168.200.130
PING 192.168.200.130 (192.168.200.130) 56(84) bytes of data.
64 bytes from 192.168.200.130: icmp_seq=1 ttl=64 time=0.042 ms
64 bytes from 192.168.200.130: icmp_seq=2 ttl=64 time=0.072 ms
64 bytes from 192.168.200.130: icmp_seq=3 ttl=64 time=0.057 ms
64 bytes from 192.168.200.130: icmp_seq=4 ttl=64 time=0.074 ms
64 bytes from 192.168.200.130: icmp_seq=5 ttl=64 time=0.073 ms
^C
--- 192.168.200.130 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.042/0.063/0.074/0.015 ms
[root@chen network-scripts]# 

1650275749126

4.1.4、配置Yum软件仓库

Yum 软件仓库的作用是为了进一步简化 RPM 管理软件的难度以及自动分析 所需软件包及其依赖关系的技术 ,要使用 Yum 软件仓库,就要先把它搭建起来,然后将其配置规则确定好才行

  • 第1步:进入到/etc/yum.repos.d/目录中(该目录存放着 Yum 软件仓库的配置文件)。
  • 第2步:使用 Vim 编辑器创建一个名为 rhel7.repo 的新配置文件(文件名称可随意,但后 缀必须为.repo),逐项写入下面加粗的配置参数并保存退出(不要写后面的中文注释)。

    • [rhel-media] :Yum 软件仓库唯一标识符,避免与其他仓库冲突。
    • name=linuxchen:Yum 软件仓库的名称描述,易于识别仓库用处。
    • baseurl=file:///media/cdrom:提供的方式包括 FTP(ftp://..)、HTTP(http://..)、本地(file:///..)。
    • enabled=1:设置此源是否可用;1 为可用,0 为禁用。
    • gpgcheck=1:设置此源是否校验文件;1 为校验,0 为不校验。
    • gpgkey=file:///media/cdrom/RPM-GPG-KEY-redhat-release:若上面参数开启校 验,那么请指定公钥文件地址。
  • 第3步:按配置参数的路径挂载光盘,并把光盘挂载信息写入到/etc/fstab 文件中。 第4步:使用“yum install httpd -y”命令检查 Yum 软件仓库是否已经可用。
[root@chen network-scripts]# cd /etc/yum.repos.d/
[root@chen yum.repos.d]# vim centos7.repo
[root@chen yum.repos.d]# vim centos7.repo

[centos7]
name=centos7
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0

1650276984986

  • 创建挂载点后进行挂载操作,并设置成开机自动挂载 (第六章会讲解)尝试使用 Yum 软 件仓库来安装 Web 服务,出现 Complete!则代表配置正确 :
[root@chen yum.repos.d]# mkdir -p /media/cdrom
[root@chen yum.repos.d]# mount /dev/cdrom /media/cdrom
mount: /dev/sr0 写保护,将以只读方式挂载
[root@chen yum.repos.d]# vim /etc/fstab
[root@chen yum.repos.d]# vim /etc/fstab
[root@chen yum.repos.d]# yum install httpd
已安装:
  httpd.x86_64 0:2.4.6-97.el7.centos.5                                                       
作为依赖被安装:
  httpd-tools.x86_64 0:2.4.6-97.el7.centos.5                 mailcap.noarch 0:2.1.41-2.el7   完毕!

1650277323165

1650277398348

1650277429712

4.2、编写Shell脚本

可以将 Shell 终端解释器当作人与计算机硬件之间的“翻译官”,它作为用户与 Linux 系 统内部的通信媒介,除了能够支持各种变量与参数外,还提供了诸如循环、分支等高级编程 语言才有的控制结构特性。要想正确使用 Shell 中的这些功能特性,准确下达命令尤为重要。 Shell 脚本命令的工作方式有两种:交互式和批处理。

交互式(Interactive):用户每输入一条命令就立即执行。

批处理(Batch):由用户事先编写好一个完整的 Shell 脚本,Shell 会一次性执行脚本 中诸多的命令。

在 Shell 脚本中不仅会用到前面学习过的很多 Linux 命令以及正则表达式、管道符、数据 流重定向等语法规则,还需要把内部功能模块化后通过逻辑语句进行处理,最终形成日常所 见的 Shell 脚本 。

4.2.1、编写简单的脚本

使用Vim 编辑器把 Linux 命令按照顺序依次写入到一个 文件中,这就是一个简单的脚本了

# 如果想查看当前所在工作路径并列出当前目录下所有的文件及属性信息,实现这个功能的脚本应该类似于下面这样
[root@chen ~]# vim chen.sh
#!/bin/bash
# For Ex BY chen
pwd
ls -al
[root@chen ~]# bash chen.sh
/root
总用量 120
dr-xr-x---. 17 root root 4096 4月  18 18:31 .
dr-xr-xr-x. 18 root root 4096 3月  25 03:11 ..
-rw-------.  1 root root 1476 4月  15 23:54 .bash_history
-rw-r--r--.  1 root root   18 12月 29 2013 .bash_logout
-rw-r--r--.  1 root root  176 12月 29 2013 .bash_profile
-rw-r--r--.  1 root root  176 12月 29 2013 .bashrc
drwx------. 13 root root 4096 3月  25 03:27 .cache
# 第二种运行脚本程序的方法是通过输入完整路径的方式来执行
# 但默认会因为权限不足而提示报错信息,此时只需要为脚本文件增加执行权限即可
[root@chen ~]# ./chen.sh
-bash: ./chen.sh: 权限不够
[root@chen ~]# chmod u+x chen.sh
[root@chen ~]# ./chen.sh
/root
总用量 120
dr-xr-x---. 17 root root 4096 4月  18 18:31 .
dr-xr-xr-x. 18 root root 4096 3月  25 03:11 ..
-rw-------.  1 root root 1476 4月  15 23:54 .bash_history
-rw-r--r--.  1 root root   18 12月 29 2013 .bash_logout
-rw-r--r--.  1 root root  176 12月 29 2013 .bash_profile
-rw-r--r--.  1 root root  176 12月 29 2013 .bashrc
drwx------. 13 root root 4096 3月  25 03:27 .cache

1650277844511

1650277922313

1650278102785

4.2.2、接收用户的参数

#Linux 系统中的 Shell 脚本语言 已经内设了用于接收参数的变量,变量之间可以使用空格间隔。
# 例如$0 对应的是当前 Shell 脚本程序的名称,
# $#对应的是总共 有几个参数,
# $*对应的是所有位置的参数值,
# #?对应的是显示上一次命令的执行返回值,而 $1、$2、$3……则分别对应着第 N 个位置的参数值
[root@chen ~]# vim chen.sh
#!/bin/bash
# For Ex BY chen
echo "当前脚本名称为$0" 
echo "总共有$#个参数,分别是$*。" 
echo "第 1 个参数为$1,第 5 个为$5。"
[root@chen ~]# sh chen.sh one two three four five six
当前脚本名称为chen.sh
总共有6个参数,分别是one two three four five six。
第 1 个参数为one,第 5 个为five。
[root@chen ~]# 

1650278614147

4.2.3、判断用户的参数

系统在执行 mkdir 命令时会判断用户输入的信息,即判断用户 指定的文件夹名称是否已经存在,如果存在则提示报错;反之则自动创建。Shell 脚本中的条 件测试语法可以判断表达式是否成立,若条件成立则返回数字 0,否则便返回其他随机数值 。

# 测试语句表达式: [ 条件表达式 ]([]两边均应有一个空格)

条件测试语句可以分为 4 种:

  • 文件测试语句;
  • 逻辑测试语句;
  • 整数值比较语句;
  • 字符串比较语句。

文件测试所用的参数

运算符 作用
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行
#使用文件测试语句来判断/etc/fstab 是否为一个目录类型的文件,然后通过 Shell 解释器的内设$?变量显示上一条命令执行后的返回值。如果返回值为 0,则目录存在;如果返回值为非零的值,则意味着目录不存在
[root@chen ~]# [ -d /etc/fstab ]
[root@chen ~]# echo $?
1
# 使用文件测试语句来判断/etc/fstab 是否为一般文件,如果返回值为 0,则代表文件存在,且为一般文件
[root@chen ~]# [ -f /etc/fstab ]
[root@chen ~]# echo $?
0
[root@chen ~]# 
# 此可以用来判断/dev/cdrom 文件是否存在,若存在则输出 Exist 字样;逻辑“与”的运算符号是&&
[root@chen ~]# [ -e /dev/cdrom ] && echo "Exist"
Exist
[root@chen ~]# echo $USER
root
# 逻辑“或”,运算符号为||
[root@chen ~]# [ $USER = root ] || echo "user"
[root@chen ~]# su - chen
上一次登录:四 4月 14 23:07:57 CST 2022pts/2 上
[chen@chen ~]$ [ $USER = root ] || echo "user"
user
[chen@chen ~]$ exit
登出
# 逻辑“非”的运算符号叹号(!)
[root@chen ~]# [ ! $USER  = root ] || echo "Administrator"
Administrator
[root@chen ~]# 

1650286601070

可用的整数比较运算符

运算符 作用
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-lt 是否小于
-le 是否等于或小于
-ge 是否大于或等于
[root@chen ~]# [ 10 -gt 10 ]
[root@chen ~]# echo $?
1
[root@chen ~]# [ 10 -eq 10 ]
[root@chen ~]# echo $?
0
[root@chen ~]# 

1650286959081

常见的字符串比较运算符

运算符 作用
= 比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空
# 通过判断 String 变量是否为空值,进而判断是否定义了这个变量
[root@chen ~]# [ -z $String ]
[root@chen ~]# echo $?
0
[root@chen ~]# [ -z $String "chen" ]
[root@chen ~]# echo $?
1
[root@chen ~]# echo $LANG
zh_CN.UTF-8
[root@chen ~]# [ $LANG != "en.US" ] && echo "Not en.US"
Not en.US
[root@chen ~]# 

1650287354516

4.3、流程控制语句

使用Linux命令、管道符、重定向以及条件测试语句来编写最基本的shell脚本,但是不适合生产环境,接下来我们将学习if、for、while、case四种流程语句来学习编写更强大、功能更强的脚本。

4.3.1、if条件测试语句

  • if 条件测试语句可以让脚本根据实际情况自动执行相应的命令。从技术角度来讲,if 语 句分为单分支结构、双分支结构、多分支结构;
  • if 条件语句的单分支结构由 if、then、fi 关键词组成 相当于口语的“如果……那么……”

1650371103107

# 下面使用单分支的 if 条件语句来判断/chen/study 目录是否存在,若存在就结束条件判断和整个 Shell 脚本,反之则去创建这个目录
[root@chen ~]# vim mkstudy.sh

#!/bin/bash
DIR="/chen/study"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
# 执行脚本
[root@chen ~]# bash mkstudy.sh 
[root@chen ~]# ls -d /chen/study
/chen/study

1650370414289

1650370501418

  • if 条件语句的双分支结构由 if、then、else、fi 关键词组成

1650371089387

# 使用双分支的 if 条件语句来验证某台主机是否在线,然后根据返回值的结果,要么 显示主机在线信息,要么显示主机不在线信息
[root@chen ~]# vim chkhost.sh

#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "Host $1 id On-line."
else
echo "Host $1 is Off-line."
fi
# 执行脚本
[root@chen ~]# vim chkhost.sh
[root@chen ~]# bash chkhost.sh 192.168.200.130
Host 192.168.200.130 id On-line.
[root@chen ~]# bash chkhost.sh 192.168.200.131
Host 192.168.200.131 is Off-line.
[root@chen ~]# 

1650370930759

  • if 条件语句的多分支结构由 if、then、else、elif、fi 关键词组成相当于口语的“如 果……那么……如果……那么……”

1650371074841

[root@chen ~]# vim chkcore.sh

#!/bin/bash
read -p "Enter your score (0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
echo "$GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
echo "$GRADE is PASS"
elif [ $GRADE -ge 0 ] && [ $GRADE -le 69 ] ; then
echo "$GRADE is Fail"
else
echo "Plase enter legal score"
fi
# 执行脚本
[root@chen ~]# vim chkcore.sh
[root@chen ~]# bash chkcore.sh 
Enter your score (0-100):88
88 is Excellent
[root@chen ~]# bash chkcore.sh 200
Enter your score (0-100):200   
Plase enter legal score

1650372101348

4.3.2、for条件循环语句

for 循环语句允许脚本一次性读取多个信息,然后逐一对信息进行操作处理,当要处理的数据 有范围时,使用 for 循环语句再适合不过了

1650457349528

# 使用 for 循环语句从列表文件中读取多个用户名,然后为其逐一创建用户账户并设置密码
# 1.首先创建用户名称的列表文件 users.txt,每个用户名称单独一行
[root@chen ~]# vim user.txt
chen
zj
ldz
wxy
# 2.接下来编写 Shell 脚本 chen.sh
# /dev/null 是一个被称作 Linux 黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁
[root@chen ~]# vim chen.sh

#!/bin/bash
# For Ex BY chen
read -p "Enter The Users Password : " PASSWD
for UNAME in `cat user.txt`
do 
        id $UNAME &> /dev/null
        if [ $? -eq 0 ]
        then
                echo "$UNAME , Already exists"
        else 
                useradd $UNAME &> /dev/null
                echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
                echo "$UNAME , Create success"
        fi
done
# 执行批量创建用户的 Shell 脚本 chen.sh,在输入为账户设定的密码后将由脚本自动检查并创建这些账户。
[root@chen ~]# vim user.txt
[root@chen ~]# vim chen.sh
[root@chen ~]# vim chen.sh
[root@chen ~]# bash chen.sh
Enter The Users Password : linux
chen , Already exists
zj , Create success
ldz , Create success
wxy , Create success
# 如果想确认这个脚本是否成功创建了用户账户,可以打开这个文件,看其中是否有这些新创建的用户信息 
[root@chen ~]# tail -6 /etc/passwd
tcpdump:x:72:72::/:/sbin/nologin
chen:x:1000:1000:chen:/home/chen:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
zj:x:1001:1001::/home/zj:/bin/bash
ldz:x:1002:1002::/home/ldz:/bin/bash
wxy:x:1003:1003::/home/wxy:/bin/bash
[root@chen ~]# 

1650459092940

# 让脚本从文本中自动读取主机列表,然后自动逐个测试这些主机是否在线
[root@chen ~]# vim ipadds.txt

192.168.200.130
192.168.200.131
192.168.200.132
# 双分支 if 条件语句与 for 循环语句相结合,让脚本从主机列表文件 ipadds.txt中自动读取 IP 地址(用来表示主机)并将其赋值给 HLIST 变量,从而通过判断 ping 命令执行后的返回值来逐个测试主机是否在线
[root@chen ~]# vim CheckHosts.sh

#!/bin/bash
HLIST=$(cat ~/ipadds.txt)
for IP in $HLIST
do
        ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
        if [ $? -eq 0 ]
        then
                echo "Host $IP is On-line."
        else
                echo "Host $IP is Off-line."
        fi
done
[root@chen ~]# ./CheckHosts.sh
-bash: ./CheckHosts.sh: 权限不够
[root@chen ~]# chmod u+x CheckHosts.sh 
[root@chen ~]# ./CheckHosts.sh
Host 192.168.200.130 is On-line.
Host 192.168.200.131 is Off-line.
Host 192.168.200.132 is Off-line.
[root@chen ~]#

1650459625882

4.3.3、while条件循环语句

while 条件循环语句是一种让脚本根据某些条件来重复执行while 循环语句通过判断条件测试的真假来决定是否继续执行命令,若条件为真就继续执行, 为假就结束循环 命令的语句

1650464536418

# 接下来结合使用多分支的 if 条件测试语句与 while 条件循环语句,编写一个用来猜测数值大小的脚本 Guess.sh
[root@chen ~]# vim Guess.sh
[root@chen ~]# vim Guess.sh

#!/bin/bash
PRICE=$(expr $RANDOM % 100)
TIMES=0
echo "商品的价格在0-99之间,猜猜看是多少?"
while true
do
        read -p "请输入你猜的价格数目:" INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
        echo "恭喜你答对了,商品的实际价格 $PRICE."
        echo "你共猜测了 $TIMES 次"
        exit 0
        elif [ $INT -gt $PRICE ] ; then
                echo "太高了!" 
        else
                echo "太低了!" 
        fi
done
# 执行脚本
[root@chen ~]# bash Guess.sh 
商品的价格在0-99之间,猜猜看是多少?
请输入你猜的价格数目:90
太高了!
请输入你猜的价格数目:85
太高了!
请输入你猜的价格数目:60
太高了!
请输入你猜的价格数目:25
太低了!
请输入你猜的价格数目:45
太高了!
请输入你猜的价格数目:42
太高了!
请输入你猜的价格数目:39
太高了!
请输入你猜的价格数目:30
太低了!
请输入你猜的价格数目:36
太低了!
请输入你猜的价格数目:38
恭喜你答对了,商品的实际价格 38.
你共猜测了 10 次
[root@chen ~]# 

1650465258956

4.3.4、case条件测试语句

case 语句是在多个范围内匹配 数据,若匹配成功则执行相关命令并结束整个条件测试;而如果数据不在所列出的范围内, 则会去执行星号(*)中所定义的默认命令

1650465367631

# 我们编写脚本 Checkkeys.sh,提示用户输入一个字符并将其赋值给变量 KEY, 然后根据变量 KEY 的值向用户显示其值是字母、数字还是其他字符
[root@chen ~]# vim CheckKeys.sh

#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
        [a-z]|[A-Z])
                echo "您输入的是 字母。"
                ;;
        [0-9])
                echo "您输入的是 数字。"
                ;;
        *)
                echo "您输入的是空格 、功能键或其他控制字符。"
esac
# 保存并执行程序
[root@chen ~]# vim CheckKeys.sh
[root@chen ~]# bash CheckKeys.sh 
请输入一个字符,并按Enter键确认:Z
您输入的是 字母。
[root@chen ~]# bash CheckKeys.sh 
请输入一个字符,并按Enter键确认:3
您输入的是 数字。
[root@chen ~]# bash CheckKeys.sh 
请输入一个字符,并按Enter键确认: 
您输入的是空格 、功能键或其他控制字符。
[root@chen ~]# 

4.4、计划任务服务程序

  1. 计划任务服务程序就是可以使得 Linux 在无需人为介入的情况下,在指定的时间段自动 启用或停止某些服务或命令,从而实现运维的自动化
  2. 计划任务分为一次性计划任务与长期性计划任务,大家可以按照如下方式理解。
  3. 一次性计划任务:今晚 11 点 30 分开启网站服务。
  4. 长期性计划任务:每周一的凌晨 3 点 25 分把/home/wwwroot 目录打包备份为 backup.tar.gz
# “at 时间”:一次性计划任务
# “at -l”命令:查看已设置好但还未执行的一次性计划任务
# “atrm 任务序号”:删除任务
[root@chen ~]# at 23:20
at> systemctl restart network  
at> 此处请同时按下 Ctrl + D 组合键来结束编写计划任务
job 2 at Wed Apr 20 23:20:00 2022
[root@chen ~]# at -l
2    Wed Apr 20 23:20:00 2022 a root
[root@chen ~]# atrm 2
[root@chen ~]# at -l
# at 命令接收前面 echo 命令的输出信息,以达到通过非交互式的方式创建计划一次性任务的目的
[root@chen ~]# echo "systemctl restart network" | at 23:30
job 3 at Wed Apr 20 23:30:00 2022
[root@chen ~]# at -l
3    Wed Apr 20 23:30:00 2022 a root
[root@chen ~]# 

1650468441867

  1. 如果我们希望 Linux 系统能够周期性地、有规律地执行某些具体的任务,那么 Linux 系统 中默认启用的 crond 服务简直再适合不过了
  • crontab -e : 创建、编辑计划任务
  • crontab -l : 查看当前计划任务
  • crontab -r : 删除某条计划任务
  • crontab -u: 编辑他人的计划任务
  1. 在正式部署计划任务前,请先跟刘遄老师念一下口诀“分、时、日、月、星期 命令”需要注意的是,如果有些字段 没有设置,则需要使用星号(*)占位

1650467966779

使用 crond 设置任务的参数字段说明

字段 说明
取值为0~59的整数
取值为0~23的任意整数
取值为1~31的任意整数
取值为1~12的任意整数
星期 取值为0-7的任意整数,其中0与7均为星期日
命令 要执行的命令或程序脚本
# 假设在每周一、三、五的凌晨 3 点 25 分,都需要使用 tar 命令把某个网站的数据目录进行打包处理,使其作为一个备份文件
# crontab -e 命令来创建计划任务
[root@chen ~]# crontab -e

25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
[root@chen ~]# crontab -e
no crontab for root - using an empty one 
crontab: installing new crontab
[root@chen ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot 
[root@chen ~]# 

注意:需要说明的是,除了用逗号(,)来分别表示多个时间段,例如“8,9,12”表示 8 月、9 月 和 12 月。还可以用减号(-)来表示一段连续的时间周期(例如字段“日”的取值为“12-15”, 则表示每月的 12~15 日)。以及用除号(/)表示执行任务的间隔时间(例如“/2”表示每隔 2 分钟执行一次任务)之外

1650468714928

在 crond 服务中需要同时包含多条计划任务的命令语句,应每行仅写一条。

[root@chen ~]# whereis rm
rm: /usr/bin/rm /usr/share/man/man1/rm.1.gz /usr/share/man/man1p/rm.1p.gz
[root@chen ~]# 
# 我们再 添加一条计划任务,它的功能是每周一至周五的凌晨 1 点钟自动清空/tmp 目录内的所有文件
[root@chen ~]# crontab -e
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
0 1 * * 1-5 /usr/bin/rm -rf /tmp/*
[root@chen ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot 
0 1 * * 1-5 /usr/bin/rm -rf /tmp/*
[root@chen ~]# 

1650469000846

注意事项:

  • 在 crond 服务的配置参数中,可以像 Shell 脚本那样以#号开头写上注释信息,这样 在日后回顾这段命令代码时可以快速了解其功能、需求以及编写人员等重要信息。
  • 计划任务中的“分”字段必须有数值,绝对不能为空或是*号,而“日”和“星期” 字段不能同时使用,否则就会发生冲突
目录
相关文章
|
7天前
|
Web App开发 Java Linux
Linux之Shell基本命令篇
Linux之Shell基本命令篇
Linux之Shell基本命令篇
|
20天前
|
算法 Linux C++
【Linux系统编程】解析获取和设置文件信息与权限的Linux系统调用
【Linux系统编程】解析获取和设置文件信息与权限的Linux系统调用
29 0
|
20天前
|
算法 Linux C++
【Linux系统编程】深入解析Linux中read函数的错误场景
【Linux系统编程】深入解析Linux中read函数的错误场景
196 0
|
20天前
|
Linux API C语言
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
28 0
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
|
8天前
|
搜索推荐 NoSQL Linux
Linux开发工具——vim篇
Linux开发工具——vim篇
|
8天前
|
Ubuntu Linux 编译器
【Linux】4. 开发工具的使用(yum/vim)
【Linux】4. 开发工具的使用(yum/vim)
41 2
|
20天前
|
存储 算法 Linux
【Linux系统编程】深入理解Linux目录扫描函数:scandir目录函数(按条件扫描目录
【Linux系统编程】深入理解Linux目录扫描函数:scandir目录函数(按条件扫描目录
37 0
|
20天前
|
存储 算法 Linux
【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构
【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构
34 0
|
8天前
|
Shell Linux
【Linux】12. 模拟实现shell
【Linux】12. 模拟实现shell
25 2
|
14天前
|
传感器 Linux API
嵌入式Linux串口编程简介
嵌入式Linux串口编程简介
13 1