文章目录

  • 一、swap分区
    • (一)查看Swap分区大小
    • (二)交换分区的创建
      • 1.以分区形式创建
      • 2.以文件形式创建
    • (三)swap分区的启动与关闭
    • (四)swap 优先级
  • 二、dd命令
  • 三、利用mail和sendmail发送邮件
  • 四、Linux定时(计划)任务
    • (一)at命令
    • (二)crontab命令
      • 1.用户周期性任务
      • 2.系统周期性任务

一、swap分区

SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用。它和Windows系统的交换文件作用类似,但是它是一段连续的磁盘空间,并且对用户不可见。

虽然SWAP分区能够作为"虚拟"的内存,但它的速度比物理内存慢太多,因此如果需要更快的速度,并不能寄希望于SWAP。最好的办法仍然是加大物理内存,SWAP分区只是临时的解决办法.

linux下的分区推荐一个交换分区,作为所划分的内存不够的时候使用

交换分区(swap)的合理值一般在内存的1.5~2 倍左右,可以适当加大。实际上具体还是以实际应用为准,swap为内存的1.5~2倍也不过是经验之谈。如果交换分区的使用都超过物理内存以上,那么只能说明服务器的性能太差了

当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。

计算机用户会经常遇这种现象。例如,在使用[Windows系统]时,可以同时运行多个程序,当你切换到一个很长时间没有理会的程序时,会听到硬盘“哗哗”直响。这是因为这个程序的内存被那些频繁运行的程序给“偷走”了,放到了Swap区中。因此,一旦此程序被放置到前端,它就会从Swap区取回自己的数据,将其放进内存,然后接着运行。

需要说明一点,并不是所有从物理内存中交换出来的数据都会被放到Swap中(如果这样的话,Swap就会[不堪重负],有相当一部分数据被直接交换到文件系统。

例如,有的程序会打开一些文件,对文件进行读写(其实每个程序都至少要打开一个文件,那就是运行程序本身),当需要将这些程序的内存空间交换出去时,就没有必要将文件部分的数据放到Swap空间中了,而可以直接将其放到文件里去。如果是读文件操作,那么内存数据被直接释放,不需要交换出来,因为下次需要时,可直接从文件系统恢复;如果是写文件,只需要将变化的数据保存到文件中,以便恢复。但是那些用malloc和new函数生成的对象的数据则不同,它们需要Swap空间,因为它们在文件系统中没有相应的“储备”文件,因此被称作“匿名”(Anonymous)内存数据。这类数据还包括堆栈中的一些状态和变量数据等。所以说,Swap空间是“匿名”数据的交换空间。

(一)查看Swap分区大小

用法: free [选项]

选项:

  • -b:以字节B为单位显示
  • -k:以k为单位输出(1k=1024B)
  • -m:以M为单位显示
  • -g:以G为单位显示
  • -h:以便于识别的方式显示
[root@Dxk ~]# free -htotal        used        free      shared  buff/cache   available
Mem:           972M        195M        666M        7.6M        109M        643M
Swap:          3.7G          0B        3.7G
[root@Dxk ~]# free -mtotal        used        free      shared  buff/cache   available
Mem:            972         195         666           7         109         643
Swap:          3815           0        3815

也可以使用swapon -s命令进行查看

[root@Dxk ~]# swapon -s
文件名           类型         大小    已用     权限
/dev/dm-1       partition   3907580     0     -2

(二)交换分区的创建

Linux下可以创建两种类型的交换空间,一种是swap分区,一种是swap文件。前者适合有空闲的分区可以使用,后者适合于没有空的硬盘分区,硬盘的空间都已经分配完毕。

系统的Swap分区大小设置多大才是最优呢? 关于这个问题,应该说只能有一个统一的参考标准,具体还应该根据系统实际情况和内存的负荷综合考虑,ORACLE官方文档推荐如下设置,这是根据物理内存来做参考

RAM Swap Space
Up to 512 MB 2 times the size of RAM
Between 1024 MB and 2048 MB 1.5 times the size of RAM
Between 2049 MB and 8192 MB Equal to the size of RAM
More than 8192 MB 0.75 times the size of RAM

1.以分区形式创建

第一种:基于普通分区的创建

添加磁盘,创建分区

[root@Dxk ~]# parted /dev/sdb mklabel gpt    #对添加的磁盘进行GPT格式分区
警告: The existing disk label on /dev/sdb will be destroyed and all
data on this disk will be lost. Do you want to continue?是/Yes/否/No? y
信息: You may need to update /etc/fstab.[root@Dxk ~]# parted /dev/sdb mkpart 1 xfs 0% 20%        #创建一个名为sdb1大小为sdb的五分之一的xfs分区
信息: You may need to update /etc/fstab.

#内核重新读取分区表

[root@Dxk ~]# partprobe /dev/sdb1

将此分区格式化为swap分区

[root@Dxk ~]# mkswap /dev/sdb1
mkswap: /dev/sdb1: warning: wiping old LVM2_member signature.
正在设置交换空间版本 1,大小 = 4193276 KiB
无标签,UUID=c478806f-5cf3-49a6-bfe7-ea0458fe8af5

查看格式化是否成功

[root@Dxk ~]# blkid /dev/sdb1
/dev/sdb1: UUID="c478806f-5cf3-49a6-bfe7-ea0458fe8af5" TYPE="swap" PARTLABEL="1" PARTUUID="beb50db8-b146-41d5-8972-c0c13556f2d2"

挂载

[root@Dxk ~]# echo "/dev/sdb1  swap swap defaults 0 0" >> /etc/fstab
[root@Dxk ~]# swapon -a        #开启/etc/fstab文件中的swap分区

查看是否成功

[root@Dxk ~]# swapon -s
文件名             类型      大小  已用  权限
/dev/dm-1                               partition   3907580 0   -2
/dev/sdb1                               partition   4193276 0   -3
[root@Dxk ~]# free -htotal        used        free      shared  buff/cache   available
Mem:           972M        187M        665M        7.6M        119M        651M
Swap:          7.7G          0B        7.7G

这样一个交换分区就创建成功了

第二种:基于逻辑卷的方式创建

创建逻辑卷

[root@Dxk ~]# parted /dev/sdb mkpart 2 xfs 20% 40%
信息: You may need to update /etc/fstab.
[root@Dxk ~]# pvcreate /dev/sdb2                                          Physical volume "/dev/sdb2" successfully created.
[root@Dxk ~]# vgcreate myvg /dev/sdb2Volume group "myvg" successfully created
[root@Dxk ~]# lvcreate -n mylv01 -L 2G /dev/myvgLogical volume "mylv01" created.

将此逻辑卷格式化为swap分区

[root@Dxk ~]# mkswap /dev/myvg/mylv01
正在设置交换空间版本 1,大小 = 2097148 KiB
无标签,UUID=eeeaa09d-fa40-4fca-9c15-adf3584fc158

查看格式化是否成功

[root@Dxk ~]# blkid /dev/myvg/mylv01
/dev/myvg/mylv01: UUID="eeeaa09d-fa40-4fca-9c15-adf3584fc158" TYPE="swap"

挂载

[root@Dxk ~]# echo "/dev/myvg/mylv01 swap swap defaults 0 0" >> /etc/fstab
[root@Dxk ~]# swapon -a

查看挂载是否成功

[root@Dxk ~]# lsblk -f
NAME            FSTYPE      LABEL UUID                                   MOUNTPOINT
sda
├─sda1          xfs               4dd7e68d-866e-45c4-90fa-a874f9860a3a   /boot
└─sda2          LVM2_member       0BZ0Fj-Chto-UjJM-1C8c-sllG-LZgX-RchmZs ├─centos-root xfs               065251f3-2332-48af-8d1e-bd8f0ecbd94f   /├─centos-swap swap              b41af099-35bc-4719-8a86-83b7476c3735   [SWAP]└─centos-home xfs               6de0d75d-afaf-4550-940f-41ec9ce3302c   /home
sdb
├─sdb1          swap              c478806f-5cf3-49a6-bfe7-ea0458fe8af5   [SWAP]
└─sdb2          LVM2_member       fSsNcd-lgdn-mvWE-PI5L-TTme-cnJN-D81888 └─myvg-mylv01 swap              eeeaa09d-fa40-4fca-9c15-adf3584fc158   [SWAP]

查看交换分区信息

[root@Dxk ~]# swapon -s
文件名             类型              大小      已用  权限
/dev/dm-1          partition    3907580      0  -2
/dev/sdb1          partition    4193276      0  -3
/dev/dm-3          partition    2097148      0  -4

所以如果是基于逻辑卷创建的swap交换分区,那么便可以进行动态的扩容和所容 ,通过 lvextend 和 lvreduce 进行实现即可

2.以文件形式创建

创建文件

[root@Dxk ~]# dd if=/dev/zero of=./swap.img count=512 bs=2M
记录了512+0 的读入
记录了512+0 的写出
1073741824字节(1.1 GB)已复制,34.7123 秒,30.9 MB/秒

格式化

[root@Dxk ~]# mkswap swap.img
正在设置交换空间版本 1,大小 = 1048572 KiB
无标签,UUID=8fec4181-b834-4903-9a41-74acfaccf699

挂载

[root@Dxk ~]# echo "/root/swap.img swap swap defaults 0 0" >> /etc/fstab
[root@Dxk ~]# swapon -a
swapon: /root/swap.img:不安全的权限 0644,建议使用 0600。
[root@Dxk ~]# chmod 600 /root/swap.img

查看交换分区是否创建成功

[root@Dxk ~]# swapon -a
[root@Dxk ~]# swapon -s
文件名                   类型         大小    已用   权限
/dev/dm-1               partition   3907580     0   -2
/dev/sdb1               partition   4193276     0   -3
/dev/dm-3               partition   2097148     0   -4
/root/swap.img          file        1048572     0   -5

(三)swap分区的启动与关闭

swapon与swapoff分别用于swap分区的启动与关闭,其二者的用法类似

如果交换分区全部开启,查看时如下所示:

[root@Dxk ~]# free -htotal        used        free      shared  buff/cache   available
Mem:           972M        171M        692M        7.6M        107M        673M
Swap:           10G          0B         10G
[root@Dxk ~]# swapon -s
文件名             类型      大小  已用  权限
/root/swap.img                          file    1048572 0   -2
/dev/sdb1                               partition   4193276 0-3
/dev/dm-1                               partition   3907580 0-4
/dev/dm-3                               partition   2097148 0-5

关闭所有交换分区

[root@Dxk ~]# swapoff -a
[root@Dxk ~]# free -h   #可以看到交换分区大小为0total        used        free      shared  buff/cache   available
Mem:           972M        168M        696M        7.6M        107M        677M
Swap:            0B          0B          0B
[root@Dxk ~]# swapon -s   #无显示信息

开启指定交换分区

[root@Dxk ~]# swapon /dev/sdb1
[root@Dxk ~]# free -htotal        used        free      shared  buff/cache   available
Mem:           972M        166M        697M        7.6M        107M        678M
Swap:          4.0G          0B        4.0G
[root@Dxk ~]# swapon -s
文件名             类型      大小  已用  权限
/dev/sdb1                               partition   4193276 0-2

开启所有交换分区

[root@Dxk ~]# free -htotal        used        free      shared  buff/cache   available
Mem:           972M        172M        692M        7.6M        107M        672M
Swap:           10G          0B         10G
[root@Dxk ~]# swapon -s
文件名             类型      大小  已用  权限
/dev/sdb1                               partition   4193276 0-2
/dev/dm-1                               partition   3907580 0-3
/dev/dm-3                               partition   2097148 0-4
/root/swap.img                          file    1048572 0   -5

关闭指定交换分区

[root@Dxk ~]# swapoff /dev/sdb1
[root@Dxk ~]# free -htotal        used        free      shared  buff/cache   available
Mem:           972M        169M        695M        7.6M        107M        676M
Swap:          6.7G          0B        6.7G
[root@Dxk ~]# swapon -s
文件名             类型      大小  已用  权限
/dev/dm-1                               partition   3907580 0-2
/dev/dm-3                               partition   2097148 0-3
/root/swap.img                          file    1048572 0   -

以上对交换分区的开启和关闭都是临时性的修改,在下次登录bash后,便会重新读取/etc/fstab文件,进行全部开启

如果想要永久禁止开启某个交换分区,那么可以将/etc/fstab文件中对应的swap语句进行注释或者删除即可

(四)swap 优先级

Linux通过一个参数swappiness来控制对交换分区使用的优先级别

这个参数值可为 0-100,控制系统 swap 的使用程度。高数值可优先系统性能,在进程不活跃时主动将其转换出物理内存。低数值可优先互动性并尽量避免将进程转换处物理内存,并降低反应延迟。默认值为 60。注意:这个只是一个权值,不是一个百分比值,涉及到系统内核复杂的算法。

swappiness=0 的时候表示最大限度使用物理内存,然后才是 swap 空间 swappiness=100 的时候表示积极的使用swap分区,并且把内存上的数据及时的交换到swap空间里。
对于物理内存比较大的设备,机器io太慢会极大的影响机器性能,所以我们可以把这个参数值设置的低一些,让操作系统尽可能的使用物理内存,降低系统对swap的使用,从而提高系统的性能。

该参数的默认值设置为30

[root@Dxk ~]# cat /proc/sys/vm/swappiness
30

将此值改为0

  • 临时修改该参数:
[root@Dxk ~]# echo 0 > /proc/sys/vm/swappiness
[root@Dxk ~]# cat /proc/sys/vm/swappiness
0

或者

[root@Dxk ~]# sysctl vm.swappiness=10
vm.swappiness = 10
[root@Dxk ~]# cat /proc/sys/vm/swappiness
10

这里我们的修改已经生效,但是如果重启系统,又会变成30

  • 永久修改该参数
    在/etc/sysctl.conf 文件里添加如下参数:vm.swappiness=参数值

这里永久修改为0

[root@Dxk ~]# echo "vm.swappiness=0" >> /etc/sysctl.conf
[root@Dxk ~]# cat /proc/sys/vm/swappiness   #可以修改后不会生效
10
[root@Dxk ~]# reboot
WARNING! The remote SSH server rejected X11 forwarding request.
Last login: Mon Oct 19 17:56:25 2020 from 192.168.126.1
[root@Dxk ~]# cat /proc/sys/vm/swappiness   #重启后便会永久生效
0

二、dd命令

用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换

  • if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
  • of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
  • ibs=NUMb(字节)、NUMK、NUMM、NUMG:一次读入NUM容量,即指定一个块大小为NUM容量。
    obs=NUMb(字节)、NUMK、NUMM、NUMG:一次输出NUM容量,即指定一个块大小为NUM容量。
    bs=NUMb(字节)、NUMK、NUMM、NUMG:同时设置读入/输出的块大小为NUM容量。
  • cbs=NUMb(字节)、NUMK、NUMM、NUMG:一次转换NUM容量,即指定转换缓冲区大小。
  • skip=blocks:从输入文件开头跳过blocks个块后再开始复制。
  • seek=blocks:从输出文件开头跳过blocks个块后再开始复制。
    注意:通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。
  • count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
  • conv=conversion:用指定的参数转换文件。
参数如下:ascii:转换ebcdic为asciiebcdic:转换ascii为ebcdicibm:转换ascii为alternate ebcdicblock:把每一行转换为长度为cbs,不足部分用空格填充unblock:使每一行的长度都为cbs,不足部分用空格填充lcase:把大写字符转换为小写字符ucase:把小写字符转换为大写字符swab:交换输入的每对字节noerror:出错时不停止notrunc:不截断输出文件sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

【例 1】
将本地的/dev/sdb整盘备份至指定文件

[root@Dxk ~]# dd if=/dev/sdb of=./test
记录了8386560+0 的读入
记录了8386560+0 的写出
4293918720字节(4.3 GB)已复制,107.755 秒,39.8 MB/秒

将备份文件恢复到指定盘

[root@Dxk ~]# dd if=./test  of=/dev/sdb

【例 2】
备份与恢复MBR

备份磁盘开始的512个字节大小的MBR信息到指定文件

[root@Dxk ~]# dd if=/dev/sdb of=./sdbbak count=1 bs=512

count=1指仅拷贝一个块;bs=512指块大小为512个字节。

恢复:

将备份的MBR信息写到磁盘开始部分

[root@Dxk ~]# dd if=./sdbbak of=/dev/sdb

破环MBR分区表

[root@Dxk ~]# dd if=/dev/zero of=/dev/sdb

【例 3】

将testfile文件中的所有英文字母转换为大写,然后转成为testfile_1文件

[root@Dxk ~]# echo "hello world" > testfile
[root@Dxk ~]# cat testfile
hello world
[root@Dxk ~]# dd if=testfile of=testfile_1 conv=ucase
记录了0+1 的读入
记录了0+1 的写出
12字节(12 B)已复制,0.000672383 秒,17.8 kB/秒
[root@Dxk ~]# cat testfile_1
HELLO WORLD

【例 4】
由标准输入设备读入字符串,并将字符串转换成小写后,再输出到标准输出设备

[root@Dxk ~]# dd conv=lcase
#输入以上命令后按回车键,输入字符串,再按回车键,按组合键Ctrl+D 退出
HELLO WORLD
hello world
记录了0+1 的读入
记录了0+1 的写出
12字节(12 B)已复制,6.52341 秒,0.0 kB/秒

【例 5】
确定硬盘的最佳块大小

三、利用mail和sendmail发送邮件

邮件发送原理示意图

  • MUA:Mail User Agent,邮件用户代理,用来编写,收发邮件
  • MTA:Mail Transfer Agent,邮件传输代理,将邮件传输到正确目的地
  • MDA:Mail Delivery Agent,邮件分发代理,将邮件分发到正确目的用户

举例说明:假如A用户使用的是QQ邮箱,B用户使用的是163邮箱,A要向B发送一封邮件。流程如下:
1、A用户通过MUA编写好邮件,并发送
2、该邮件通过MTA,首先发送到QQ邮件服务器
3、QQ邮件服务器分析到目的邮箱地址是163,所以再通过MTA传送到163邮件服务器
4、163邮件服务器收到该邮件
5、由于使用163邮箱的用户有很多,再通过MDA把该邮件发送到正确的用户
6、B用户通过MUA就可以查看A用户发送的邮件。

这里使用qq邮箱做演示

1、安装mail和sendmail

[root@Dxk ~]# yum install  mailx sendmail -y
# mail是mailx的别名,mail是MUA,sendmail是MTA

2、获取QQ邮箱的授权码

进入邮箱后–>设置–>账户


下拉,开启下图1中的POP3/SMTP服务

开启时需要进行验证,发送短信进行验证:

发送完毕后,点击【我已发送】

这时便会提供授权码,如下图1中所示 ,复制授权码,而后点击【确定】

3、配置mail

mail系统及配置文件为/etc/mail.rc,用户级配置文件为~/.mailrc。这里使用全局配置文件,在/etc/mail.rc文件最后添加如下内容:

在/etc/mail.rc添加以下设置:

set sendcharsets=iso-8859-1,utf-8   #发送的编码格式
set from=xxxxxxx.com    # 设置发信人邮箱和昵称
set smtp=smtp.qq.com          # 这里填入smtp地址
set smtp-auth-user=qq号@qq.com  # 这里输入邮箱账号
set smtp-auth-password=XXXXXXXXXXXX    # 这里填入密码,就是刚才的授权码
set smtp-auth=login        # 认证方式
set ssl-verify=ignore      # 忽略证书警告
set nss-config-dir=/etc/pki/nssdb  # 证书所在目录

4、启动sendmail

[root@Dxk ~]# systemctl start sendmail

5、通过mail命令发送邮件
三种常用格式发信:

第一种方法,你可以把当前shell当成编辑器来用,编辑完内容后,按【Ctrl+D】 结束
mail -s SUBJECT 收件人邮箱地址 #这里的test为此邮件的主题(题目)

例:

[root@Dxk ~]# mail -s MyFirstPost 916719080@qq.com
Hello,How are you?
EOT
#此邮件题目为MyFirstPost;内容是:Hello,How are you?;发送给:916719080@qq.com

编辑完后按下【Ctrl+D】便会发送过去。

第二种方法:使用管道
echo “邮件内容” | mail -s test 收件人邮箱地址

[root@Dxk ~]# echo "I'm fine" | mail -s MySecondPost 916719080@qq.com  #按下回车键便发送
#此邮件题目为MySecondPost;内容是:I'm fine;发送给:916719080@qq.com

#第三种方法,以file的内容为邮件内容发信
mail -s test 收件人邮箱地址 < file

[root@Dxk ~]# cat file1
And you
[root@Dxk ~]# mail -s MyThirdPost 916719080@qq.com < file1
#此邮件题目为MyThirdPost;内容是:And you;发送给:916719080@qq.com

四、Linux定时(计划)任务

未来的某时间点执行一次某任务或者周期性的运行某个任务,执行结果会通过邮件的形式发送给用户

定时(计划)任务分类两类:1、一次性定时计划任务(atd服务):at命令;2、周期性的运行某任务(crond服务):crontab命令

(一)at命令

at命令是一次性定时计划任务,at的守护进程atd会以后台模式运行,检查作业队列来运行作业

atd守护进程会检查系统上的一个特殊目录来获取at命令的提交的作业,默认情况下,atd守护进程每60秒检查一次目录,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业。

注意:at命令是一次性定时计划任务,执行完一个任务后不再执行此任务了。

(一)时间定义

at允许使用一套相当复杂的指定时间的方法。

  • 能够接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。 例如:04:00
  • 能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间
  • 能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。 例如:12pm
  • 能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年),指定的日期必须跟在指定时间的后面。 例如:04:00 2009-03-1
  • 能够使用相对计时法。指定格式为:now + count time-units ,now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,几天,几小时。 例如:now + 5 minutes 04pm + 3 days
  • 能够直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。

(二)用法

格式: at 选项 参数

选项:

  • -q : 使用指定的伫列(Queue)来储存,at 的资料是存放在所谓的 queue 中,使用者可以同时使用多个queue,而 queue 的编号为 a, b, c… z 以及 A, B, … Z 共 52 个
  • -m : 即使程序/指令执行完成后没有输出结果, 也要寄封信给使用者
  • -f file : 读入预先写好的命令档。使用者不一定要使用交谈模式来输入,可以先将所有的指定先写入档案后再一次读入网络应用
  • -l : 列出所有的指定 (使用者也可以直接使用 atq 而不用 at -l)
  • -d : 删除指定 (使用者也可以直接使用 atrm 而不用 at -d)
  • -v : 列出所有已经完成但尚未删除的指定
  • -c job:打印任务的内容到标准输出

(三)相关命令

atq:列出用户的计划任务,如果是超级用户将列出所有用户的任务,结果的输出格式为:作业号、日期、小时、队列和用户名

atrm job:根据Job number删除at任务

batch:在系统负荷允许的情况下执行at任务,换言之,就是在系统空闲的情况下才执行at任务

(四)相关配置文件

1)时间规范的确切定义可以在 /usr/share/doc/at-3.1.13/timespec 中查看;

2)默认情况下计划任务存放/var/spool/at/ 文件夹中;

3)root用户可以在任何情况下使用at命令,而其他用户使用at命令的权限定义在 /etc/at.allow(被允许使用计划任务的用户)和 /etc/at.deny(被拒绝使用计划任务的用户)文件中,默认没有文件需要自己创建允许用户和拒绝用户文件;

4)如果/etc/at.allow文件存在,只有在该文件中的用户名对应的用户才能使用at

5)如果/etc/at.allow文件不存在,/etc/at.deny存在,所有不在/etc/at.deny文件中的用户可以使用at;

6)at.allow比at.deny优先级高,执行用户是否可以执行at命令,先看at.allow文件中有没有才看at.deny文件

7)如果/etc/at.allow和/etc/at.deny文件都不存在,则只有root用户能使用at

8)一个空内容的/etc/at.deny表示任何用户都能使用at命令,这是默认的配置;

9)一般情况下这两个文件存在一个即可。如果只有少数几个用户需要使用计划任务,那么就保留at.allow文件,如果大部分用户都要使用计划任务,那么保留at.deny即可。

使用atd服务前需要先进行安装

[root@Dxk ~]# yum install at

启动该服务并查看

[root@Dxk ~]# systemctl start atd
[root@Dxk ~]# systemctl status atd
● atd.service - Job spooling toolsLoaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)Active: active (running) since 二 2020-10-20 15:25:05 CST; 1s agoMain PID: 1512 (atd)CGroup: /system.slice/atd.service└─1512 /usr/sbin/atd -f10月 20 15:25:05 Dxk systemd[1]: Started Job spooling tools.

【例 1】
一分钟后在控制台输出字符串 Hello

[root@Dxk init.d]# at now +1 minutes
at> echo Hello       #输入任务
at><EOT>           #Ctrl+D会直接退出
job 1 at Tue Oct 20 15:50:00 2020

【例 2】
两天后的上午8点执行 top命令

[root@Dxk init.d]# at 8am+2 days
at> /usr/bin/top
at> <EOT>
job 3 at Thu Oct 22 08:00:00 2020

【例 4】
查看待处理任务

[root@Dxk init.d]# atq
3   Thu Oct 22 08:00:00 2020 a root

【例 4】
删除待处理任务

[root@Dxk init.d]# at 5:00pm
at> echo "123456" > filetest
at> <EOT>
job 4 at Tue Oct 20 17:00:00 2020
[root@Dxk init.d]# atq
3   Thu Oct 22 08:00:00 2020 a root
4   Tue Oct 20 17:00:00 2020 a root
[root@Dxk init.d]# atrm 4
[root@Dxk init.d]# atq
3   Thu Oct 22 08:00:00 2020 a root

【例 5】
根据任务ID查看具体内容

[root@Dxk init.d]# atq
3   Thu Oct 22 08:00:00 2020 a root
[root@Dxk init.d]# at -c 3  #查看ID为3的任务内容
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
………省略………
………省略………${SHELL:-/bin/sh} << 'marcinDELIMITER4a27ceb3'
/usr/bin/topmarcinDELIMITER4a27ceb3

【例 6】
一分钟后执行/root/date文件中的内容

[root@Dxk ~]# vim date
[root@Dxk ~]# cat /root/date
#!bin/bash
date "+%F %T" > /root/date.log
[root@Dxk ~]# at -f /root/date now +1 minutes  #设置1分钟后执行/root/date文件中的内容
job 5 at Tue Oct 20 16:20:00 2020
[root@Dxk ~]# atq          #查看该任务是否设置成功
3   Thu Oct 22 08:00:00 2020 a root
5   Tue Oct 20 16:20:00 2020 a root
[root@Dxk ~]# date
2020年 10月 20日 星期二 16:19:59 CST
[root@Dxk ~]# cat /root/date.log  #一分钟后查看/root/date.log中的内容,验证任务是否执行成功
2020-10-20 16:20:00

(二)crontab命令

at 命令在指定的时间仅能执行一次任务,但在实际工作中,系统的定时任务一般是需要重复执行的。而 at 命令显然无法满足需求,这是就需要使用 crontab 命令来执行循环定时任务。crontab 命令需要 crond 服务支持

crond是linux系统中用来定期执行命令或者指定程序任务的一种服务或者软件(守护进程),与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程。

crond默认情况(每分钟),会检查系统中是否有需要执行的定时任务,如果有,就会根据事先定义好的规则来执行这个定时任务。就好比生活中的闹钟一样,定点执行。但是crond对于秒钟是无能为力的,但是可以用shell脚本来实现。

计划任务主要是做一些周期性的任务,比如凌晨3点定时备份数据、晚上23点开启网站抢购接口、凌晨0点关闭抢占接口等。

Linux下的周期性任务分为两类,系统周期性任务和用户周期性任务

  • 系统周期性任务:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。/etc/crontab文件就是系统任务调度的配置文件。
  • 用户周期性任务:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab文件都被保存在/var/spool/cron目录中

1.用户周期性任务

crontab 命令。该命令和 at 命令类似,也是通过 /etc/cron.allow 和 /etc/cron.deny 文件来限制某些用户是否可以使用 crontab 命令的。而且原则也非常相似:

  • 当系统中有 /etc/cron.allow 文件时,只有写入此文件的用户可以使用 crontab 命令,没有写入的用户不能使用 crontab 命令。同样,如果有此文件,/etc/cron.deny 文件会被忽略,因为 /etc/cron.allow 文件的优先级更高。
  • 当系统中只有 /etc/cron.deny 文件时,写入此文件的用户不能使用 crontab 命令,没有写入文件的用户可以使用 crontab 命令。
  • 这个规则基本和 at 命令的规则一致,同样是 /etc/cron.allow 文件比 /etc/cron.deny 文件的优先级高,Linux 系统中默认只有 /etc/cron.deny 文件。

每个用户都可以实现自己的 crontab 定时任务,只需使用这个用户身份执行“crontab -e”命令即可。当然前提是这个用户不能写入 /etc/cron.deny 文件。

可以使用命令:service crond status(CentOS6)systemctl status crond(CentOS7)进行查看crond服务运行状况

用法: crontab [选项] [file]

注意,这里的 file 指的是命令文件的名字,表示将 file 作为 crontab 的任务列表文件并载入 crontab,若在命令行中未指定文件名,则此命令将接受标准输入(键盘)上键入的命令,并将它们键入crontab文件中

选项:

  • -u user :用来设定某个用户的 crontab 服务,例如 “-u demo” 表示设备 demo用户的 crontab 服务,此选项一般有 root 用户来运行。
  • -e :编辑某个用户的 crontab 文件内容。指定dxk用户,crontab -u dxk -e ;如果不指定用户,则表示编辑当前用户的 crontab 文件。
  • -l :显示某用户的 crontab 文件内容。指定dxk用户,crontab -u dxk -l ;如果不指定用户,则表示显示当前用户的 crontab 文件内容。
  • -r :从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件。
  • -i :在删除用户的 crontab 文件时,给确认提示。

其实 crontab 定时任务非常简单,只需执行“crontab -e”命令,然后输入想要定时执行的任务即可。不过,当我们执行“crontab -e”命令时,打开的是一个空文件,而且操作方法和 Vim 是一致的。

那么,这个文件的格式才是我们真正需要学习的内容。文件格式如下:

[root@Dxk ~]# crontab -e
#进入 crontab 编辑界面。会打开Vim编辑你的任务
* * * * * 执行的命令或脚本(命令要使用绝对路径)

格式:* * * * * 执行的命令或脚本
切记:命令和脚本要使用绝对路径

这个文件中是通过 5 个“”来确定命令或任务的执行时间的,这 5 个“”的具体含义如下所示。

项目 含义 范围
第一个"*" 一小时当中的第几分钟(minute) 0~59
第二个"*" 一天当中的第几小时(hour) 0~23
第三个"*" 一个月当中的第几天(day) 1~31
第四个"*" 一年当中的第几个月(month) 1~12
第五个"*" 一周当中的星期几(week) 0~7(0和7都代表星期日)

在时间表示中,还有一些特殊符号需要学习,如下所示。

特殊符号 含义
*(星号) 代表任何时间。比如第一个"*"就代表一小时种每分钟都执行一次的意思。
,(逗号) 代表不连续的时间。比如"0 8,12,16***命令"就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。
-(中杠) 代表连续的时间范围。比如"0 5 ** 1-6命令",代表在周一到周六的凌晨 5 点 0 分执行命令。
/(正斜线) 代表每隔多久执行一次。比如"/10***命令",代表每隔 10 分钟就执行一次命令

crontab语法格式:

举例:

表示 含义
3 * * * * 每小时执行一次;每小时的第3分钟;
3 4 * * 5 每周执行一次;每周5的4点3分;
5 6 7 * * 每月执行一次;每月的7号的6点5分;
7 8 9 10 * 每年执行一次;每年的10月9号8点7分;
9 8 * * 3,7 每周三和周日;
0 8,20 * * 3,7 每周三和周日的8点和20点
0 9-18 * * 1-5 每周一都周五的早九点到晚18点
*/5 * * * * 每5分钟执行一次某任务;

当“crontab -e”编辑完成之后,一旦保存退出,那么这个定时任务实际就会写入 /var/spool/cron/ 目录中,每个用户的定时任务用自己的用户名进行区分。但请不要使用vi或vim直接编辑该文件,因为可能由于输入语法错误,会导致无法执行cron。cron执行的每一项任务都会被记录到/var/log/cron这个日志文件中

crontab 命令只要保存就会生效,只要 crond 服务是启动的。在“执行的任务”字段中既可以定时执行系统命令,也可以定时执行某个 Shell 脚本

如果周期性计划任务执行错误或者执行有输出信息的话,那么对应的标准输出和标准错误输出都会给root用户以邮件的方式发送
所以说:

【例 1】
普通用户dxk直接使用crontab命令,进行交互式添加执行任务

[dxk@Dxk 17:28:07 ~]$crontab
* * * * * /usr/bin/ls    #输入完毕后,按下回车键和【ctrl+D】组合键就直接写入

那么此执行任务的语句将写入/var/spool/cron/dxk文件中,当然此文件普通用户是无法查看的

[dxk@Dxk 17:48:26 ~]$cat /var/spool/cron/dxk
cat: /var/spool/cron/dxk: 权限不够

只有root用户才可以查看

[root@Dxk ~]# cat /var/spool/cron/dxk
* * * * * /usr/bin/ls

其实也可以采取编辑文件方式添加交互任务,那么需要使用crontab -e

[dxk@Dxk 18:40:34 ~]$crontab -e* * * * * /usr/bin/ls        #这行是刚才采取交互方式添加的
~
~
~
~                                                                 "/tmp/crontab.q6pZ3W" 1L, 22C

使用vi的方式进行添加即可,但是要根据规则进行编辑
使用crontab和crontab -e添加计划任务时,会自动进行语法检查,如果语法有错误会提示重新编辑或不能生效的提示信息

crontab -e是制定当前用户的周期计划任务

但是使用crontab交互式添加计划任务,会将之前文件中的计划任务全部删除后,将当前所编辑的计划任务写入(即覆盖式写入),所以要想累计添加多个计划任务时,就要使用crontab -e

【例 2】
在每月 1 日、10 日、15 日的凌晨 3 点 30 分都定时执行日志备份脚本 autobak.sh

[root@Dxk ~]# crontab -e
30 3 1,10,15 * * /root/sh/autobak.sh

【例 3】
删除当前用户的所有计划任务(直接删除,不询问是否删除)

[root@Dxk cron]# crontab    #给当前用户(root)创建一个计划任务,每天的22:30关机
30 22 * * * /sbin/shutdown -h now
[root@Dxk cron]# cat /var/spool/cron/root  #可以看到,写入该文件当中
30 22 * * * /sbin/shutdown -h now
[root@Dxk cron]# crontab -r             #删除当前用户的所有计划任务
[root@Dxk cron]# cat /var/spool/cron/root
cat: /var/spool/cron/root: 没有那个文件或目录
[root@Dxk cron]# ls   #相当于是删除了/var/spool/cron/root文件
dxk

同时也可以进行交互式删除,使用 crontab -ri 即可

如想删除某个计划任务,使用 crontab -e 进入vi模式,删除该计划任务语句即可

【例 4】
为指定用户创建计划任务(普通用户无法使用该功能)

[root@Dxk cron]# crontab -u dxk -e

进入编辑模式为该用户创建计划任务即可,同时还可以查看该用户的其他计划任务信息

【例 4】
查看当前用户的周期计划任务

[root@Dxk cron]# crontab -l
30 3 1,10,15 * * /root/sh/autobak.sh
* * * * * /usr/bin/ls
30 22 * * * /sbin/shutdown -h now

查看指定用户的周期计划任务(只有root才能查看其他用户的)

[root@Dxk cron]# crontab -l -u dxk
* * * * * /usr/bin/ls

普通用户都只能查看自己的

在书写 crontab 定时任务时,需要注意以下几个事项:

  • 6 个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间。
  • crontab 定时任务的最小有效时间是分钟最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。
  • 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆。
  • 在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对路径的命令会报错。

2.系统周期性任务

“crontab -e”是每个用户都可以执行的命令,也就是说,不同的用户身份可以执行自己的定时任务。但是有些定时任务需要系统执行,这时就需要编辑 /etc/crontab 这个配置文件

当然,并不是说写入 /etc/crontab 配置文件中的定时任务在执行时不需要用户身份,而是“crontab -e”命令在定义定时任务时,默认用户身份是当前登录用户;而在修改 /etc/crontab 配置文件时,定时任务的执行者身份是可以手工指定的。这样定时任务的执行会更加灵活,修改起来也更加方便。

修改/etc/crontab这种方法只有root用户能用,这种方法更加方便与直接,同时也可以给其他用户设置计划任务

[root@Dxk ~]# cat /etc/crontab
SHELL=/bin/bash            #标识使用哪种Shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin #指定PATH环境变量。crontab使用自己的PATH,而不使用系统默认的PATH
MAILTO=root    #如果有报错输出,或命令结果有输出,则会向root发送信息# For details see man 4 crontabs# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

书写格式:分 时 日 月 周 执行者身份 命令
所代表的意思就是:每到指定时间就要以某个用户的身份执行什么命令

从这个文件的内容可以看出,这个文件与输入crontab -e 所要输入内容几乎完全相同,只是下面几个地方有所区别:

  • MAILTO=root:这个字段说明了当/etc/crontab文件中的例行性命令发生错误时,会将错误信息或屏幕显示的信息传递给谁,由于root无法在客户端收信,因此,可以将这个email改成自己普通用户帐号
  • crontab -e 与 /etc/crontab 修改语法格式不一样,后者多一个 user 指定
  • SHELL=/bin/bash:可以指定执行shell

基本上:
/etc/crontab支持两种输入指令的方式,一种是直接以指令形式输入,一种则是以目录形式输入

(1)指令形式:

0 1 * * * * dxk /usr/bin/mail -s test xxxxxxxxx@qq.com < /home/dxk/file ——用户是dxk,且每小时执行一次指令mail发送邮件……

(2)目录形式

*/5 * * * * root run-parts /root/runcron ——建立一个/root/runcron目录,将以root身份每隔5分钟执行一次的可执行文件都写到该目录下,就可以让系统每5分钟执行一次该目录下的所有可执行文件。

例如:

[root@Dxk etc]# cd cron
cron.d/       cron.deny     cron.monthly/ cron.weekly/
cron.daily/   cron.hourly/  crontab

/etc/crontab 文件会使用 run-parts 脚本执行 /etc/cron.{daily,weekly,monthly} 目录中的所有文件。这个 run-parts 其实是一个 Shell 脚本,保存在 /usr/bin/run-parts 中

所以,基于系统周期行计划任务的配置方法有两种:

  • 第一种方法就是把需要定时执行的工作写成脚本程序,并赋予执行权限,然后直接把这个脚本复制到 /etc/cron.{daily,weekly,monthly} 目录中的任意一个。比如,我需要让某个脚本每周执行,就把这个脚本复制到 /etc/cron.weekly/ 目录中。这样这个脚本就会每周执行一次,具体的执行时间要参考 anacron 的配置文件。

  • 第二种方法就是修改 /etc/crontab 这个配置文件,加入自己的定时任务,不过需要注意指定脚本的执行者身份

【例 】

[root@Dxk etc]# cd
[root@Dxk ~]# mkdir cron  #建立/root/cron/目录
[root@Dxk ~]# cd cron
[root@Dxk cron]# vi hello.sh
[root@Dxk cron]# cat hello.sh
#!bin/bash
echo "hello" >> /root/cron/hello.log   #一旦执行该脚本,便向/root/cron/hello.log文件中写入“hello”
[root@Dxk cron]# chmod 755 hello.sh #赋予执行权限
[root@Dxk cron]# vi /etc/crontab
……省略……
* * * * * root /usr/bin/run-parts /root/cron/  #让系统每分钟都执行一次/root/cron/目录中的脚本,脚本执行者是root用户;#使用run-parts脚本调用并执行/root/cron/目录中所有的可执行文件
……省略……

因为hello.sh脚本放入了/root/cron/目录中,所以每分钟执行一次

#过去了四分钟,所以该文件中出现了四次
[root@Dxk cron]# cat /root/cron/hello.log
hello
hello
hello
hello

基本上,cron服务的最低检测时间单位是分钟,所以cron会每分钟读取一次/etc/crontab与/var/spool/cron中的数据内容,因此,只要编辑完/etc/crontab文件并且保存之后,crontab时设定就会自动执行。

定时任务规范及注意事项:

  • 计划任务脚本指定存放位置,便于维护和定期备份

  • 写定时任务前必须在前面写注释,包括:添加计划任务的人,添加任务的时间,任务有效期,计划任务脚本的对象,脚本的作用,以及其他需要提醒的其他事项

  • 执行的脚本前加上/bin/bash或者/bin/sh,脚本必须使用完整的绝对路径

  • 定时任务,需要尽量避免标准输出和标准错误输出 结尾加上 >/dev/null 2>&1

  • 计划任务的标准输出和标准错误输出都会给root用户以邮件,很容易撑满磁盘消耗磁盘inode

  • 计划任务的日志文件存在于文件 /var/log/cron-

  • 能用命令完成的也要写在脚本里

  • 在指定用户下执行相关的定时任务

  • 制定标准的书写规范

  • 环境变量问题:计划任务的脚本得环境变量需要在脚本重新定义,可以手动在脚本内加载环境变量的配置文件。如:/etc/profile

Linux笔记 No.19---(swap分区、dd命令、mail发送邮件、定时计划任务at和crontab)相关推荐

  1. linux 磁盘数据空 还有读写,Linux入门之磁盘管理(5)dd命令使用

    Linux入门之磁盘管理(5)dd命令使用 在Linux中,经常需要一些数据读写等测试,还有文件以及其它数据的备份迁移,一般使用cp命令可以解决一部分,但是其无法进行控制数据的流向及动作,这时就可以使 ...

  2. linux下增加swap分区,LINUX新建和增加SWAP分区

    我们都知道在安装Linux系统时在分区时可以分配swap分区,而系统安装后(在运行中)如何建立或调整swap分区呢? 在装完Linux系统之后,建立Swap分区有两种方法. 1.新建磁盘分区作为swa ...

  3. 【linux】实战扩展swap分区

    swap 分区 Swap分区在系统的物理内存不够用的时候,把硬盘空间中的一部分空间释放出来,以供当前运行的程序使用. 基础命令: mkswap /devices : 格式化成swap格式 swapon ...

  4. dd linux 尾部添加0_Linux 下的dd命令使用详解(摘录)

    一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. ...

  5. dd linux 尾部添加0_linux下的dd命令使用详解

    一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. ...

  6. linux 找不到swap分区,Linux下swap分区没有UUID解决办法

    前几天在windows下使用分区调整软件更改了一下我Linux下swap分区的大小,linux 以后再进入Linux时发现swap分区没法挂载.打开/etc/fstab查看一下挂载配置,发现挂载分区时 ...

  7. Linux系统中增加Swap分区大小

    1.检查当前的分区情况: [root@localhost]#free -m 2.增加交换分区文件及大小,如果要增加2G大小的交换分区,则命令写法如下,其中的 count 等于想要的块大小. [root ...

  8. linux中将文本中的单词换掉的指令_从零开始学Linux运维|19.文本处理相关命令(2)...

    1.tr tr用于替换文本文件中的字符,格式为"tr [要替换的字符] [替换后的字符]" tr不能用于替换完整字符串,只能替换对应的字符 将小写都替换成大写"cat t ...

  9. linux增加分区swap,linux中Centos7增加swap分区详解

    注意:(Redhat5官方推荐) RAM<=4G,swap=2G;RAM>4G,<16G,swap=4G;RAM>16G,<64G,swap=8G;RAM>64G, ...

最新文章

  1. js md5加密脚本
  2. EF(Linq)框架使用过程中的小技巧汇总
  3. 摔跤视频软件测试,Apple Watch 4摔倒检测立功:成功救人一命,网友:马上入手!...
  4. 前端学习(8):HTML的基本属性和结构
  5. Transport Ship【多重背包】
  6. 解决Numpy 报错 ValueError: zero-size array to reduction operation maximum which has no identity
  7. 冬知寒,我方暖,3本Python好书赠你慢慢品
  8. mysql 创建用户命令-grant
  9. SQLAlchemy 对象缓存和刷新
  10. webService教程之cxf框架
  11. SLA文档提高期学习总结
  12. c语言中(char)的用法,c语言中char的用法是什么意思.docx
  13. segmentation fault(core dump);Run-Time Check Failure #3 -The variable 'p' is being used without bein
  14. 幻方构造方法及C语言实现
  15. 学习Flash制作高射炮游戏
  16. Python之Socket自动重连
  17. centos6.7 安装端口映射工具 rinetd
  18. 猫眼盯上KOL,娱乐营销得靠网红了?
  19. SRT协议应用于直播加速CDN,超越RTMP,实现200ms以下的 低延时、弱网传输
  20. 华为当个pl怎么样_PL是华为最难干的岗位吗?

热门文章

  1. 二维非稳态导热微分方程_传热学--第四章 第三节 非稳态导热数值解法
  2. 中国式家长怎么继续学计算机,中国式家长怎么学算法 掌握方法是简单事
  3. 集成电路重大利好!广东发布20个战略计划
  4. 我感觉我创业做游戏应该不会亏
  5. element-Ui统一修改el-input样式
  6. [经验教程]开通腾讯视频VIP会员怎么领取开通京东Plus联合会员?
  7. 擎天柱和好朋友的故事:MIT让机器人团结友爱互相传授技能
  8. mysql创建用户/用户ip绑定,用户授权
  9. 【小强推歌】---音乐从今天开始
  10. 数据结构与算法--稀松数组(Sparse Array)