Linux笔记 No.19---(swap分区、dd命令、mail发送邮件、定时计划任务at和crontab)
文章目录
- 一、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)相关推荐
- linux 磁盘数据空 还有读写,Linux入门之磁盘管理(5)dd命令使用
Linux入门之磁盘管理(5)dd命令使用 在Linux中,经常需要一些数据读写等测试,还有文件以及其它数据的备份迁移,一般使用cp命令可以解决一部分,但是其无法进行控制数据的流向及动作,这时就可以使 ...
- linux下增加swap分区,LINUX新建和增加SWAP分区
我们都知道在安装Linux系统时在分区时可以分配swap分区,而系统安装后(在运行中)如何建立或调整swap分区呢? 在装完Linux系统之后,建立Swap分区有两种方法. 1.新建磁盘分区作为swa ...
- 【linux】实战扩展swap分区
swap 分区 Swap分区在系统的物理内存不够用的时候,把硬盘空间中的一部分空间释放出来,以供当前运行的程序使用. 基础命令: mkswap /devices : 格式化成swap格式 swapon ...
- dd linux 尾部添加0_Linux 下的dd命令使用详解(摘录)
一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. ...
- dd linux 尾部添加0_linux下的dd命令使用详解
一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. ...
- linux 找不到swap分区,Linux下swap分区没有UUID解决办法
前几天在windows下使用分区调整软件更改了一下我Linux下swap分区的大小,linux 以后再进入Linux时发现swap分区没法挂载.打开/etc/fstab查看一下挂载配置,发现挂载分区时 ...
- Linux系统中增加Swap分区大小
1.检查当前的分区情况: [root@localhost]#free -m 2.增加交换分区文件及大小,如果要增加2G大小的交换分区,则命令写法如下,其中的 count 等于想要的块大小. [root ...
- linux中将文本中的单词换掉的指令_从零开始学Linux运维|19.文本处理相关命令(2)...
1.tr tr用于替换文本文件中的字符,格式为"tr [要替换的字符] [替换后的字符]" tr不能用于替换完整字符串,只能替换对应的字符 将小写都替换成大写"cat t ...
- linux增加分区swap,linux中Centos7增加swap分区详解
注意:(Redhat5官方推荐) RAM<=4G,swap=2G;RAM>4G,<16G,swap=4G;RAM>16G,<64G,swap=8G;RAM>64G, ...
最新文章
- js md5加密脚本
- EF(Linq)框架使用过程中的小技巧汇总
- 摔跤视频软件测试,Apple Watch 4摔倒检测立功:成功救人一命,网友:马上入手!...
- 前端学习(8):HTML的基本属性和结构
- Transport Ship【多重背包】
- 解决Numpy 报错 ValueError: zero-size array to reduction operation maximum which has no identity
- 冬知寒,我方暖,3本Python好书赠你慢慢品
- mysql 创建用户命令-grant
- SQLAlchemy 对象缓存和刷新
- webService教程之cxf框架
- SLA文档提高期学习总结
- c语言中(char)的用法,c语言中char的用法是什么意思.docx
- segmentation fault(core dump);Run-Time Check Failure #3 -The variable 'p' is being used without bein
- 幻方构造方法及C语言实现
- 学习Flash制作高射炮游戏
- Python之Socket自动重连
- centos6.7 安装端口映射工具 rinetd
- 猫眼盯上KOL,娱乐营销得靠网红了?
- SRT协议应用于直播加速CDN,超越RTMP,实现200ms以下的 低延时、弱网传输
- 华为当个pl怎么样_PL是华为最难干的岗位吗?