1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Linux笔记 No.19---(swap分区 dd命令 mail发送邮件 定时计划任务at和crontab)

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

时间:2023-04-16 11:01:39

相关推荐

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 freeshared buff/cache availableMem: 972M 195M 666M 7.6M 109M 643MSwap:3.7G0B 3.7G[root@Dxk ~]# free -mtotal used freeshared buff/cache availableMem: 972 195 666 7 109 643Swap:3815 0 3815

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

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

(二)交换分区的创建

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

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

1.以分区形式创建

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

添加磁盘,创建分区

[root@Dxk ~]# parted /dev/sdb mklabel gpt #对添加的磁盘进行GPT格式分区警告: The existing disk label on /dev/sdb will be destroyed and alldata 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/sdb1mkswap: /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-1partition39075800-2/dev/sdb1partition41932760-3[root@Dxk ~]# free -htotal used freeshared buff/cache availableMem: 972M 187M 665M 7.6M 119M 651MSwap:7.7G0B 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 -fNAME FSTYPELABEL UUIDMOUNTPOINTsda├─sda1xfs4dd7e68d-866e-45c4-90fa-a874f9860a3a /boot└─sda2LVM2_member 0BZ0Fj-Chto-UjJM-1C8c-sllG-LZgX-RchmZs ├─centos-root xfs065251f3-2332-48af-8d1e-bd8f0ecbd94f /├─centos-swap swap b41af099-35bc-4719-8a86-83b7476c3735 [SWAP]└─centos-home xfs6de0d75d-afaf-4550-940f-41ec9ce3302c /homesdb├─sdb1swap c478806f-5cf3-49a6-bfe7-ea0458fe8af5 [SWAP]└─sdb2LVM2_member fSsNcd-lgdn-mvWE-PI5L-TTme-cnJN-D81888 └─myvg-mylv01 swap eeeaa09d-fa40-4fca-9c15-adf3584fc158 [SWAP]

查看交换分区信息

[root@Dxk ~]# swapon -s文件名类型大小 已用权限/dev/dm-1partition3907580 0-2/dev/sdb1partition4193276 0-3/dev/dm-3partition2097148 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 -aswapon: /root/swap.img:不安全的权限 0644,建议使用 0600。[root@Dxk ~]# chmod 600 /root/swap.img

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

[root@Dxk ~]# swapon -a[root@Dxk ~]# swapon -s文件名 类型 大小 已用权限/dev/dm-1 partition39075800-2/dev/sdb1partition41932760-3/dev/dm-3partition20971480-4/root/swap.imgfile10485720-5

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

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

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

[root@Dxk ~]# free -htotal used freeshared buff/cache availableMem: 972M 171M 692M 7.6M 107M 673MSwap: 10G0B 10G[root@Dxk ~]# swapon -s文件名类型大小已用权限/root/swap.imgfile10485720-2/dev/sdb1partition41932760-3/dev/dm-1partition39075800-4/dev/dm-3partition20971480-5

关闭所有交换分区

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

开启指定交换分区

[root@Dxk ~]# swapon /dev/sdb1[root@Dxk ~]# free -htotal used freeshared buff/cache availableMem: 972M 166M 697M 7.6M 107M 678MSwap:4.0G0B 4.0G[root@Dxk ~]# swapon -s文件名类型大小已用权限/dev/sdb1partition41932760-2

开启所有交换分区

[root@Dxk ~]# free -htotal used freeshared buff/cache availableMem: 972M 172M 692M 7.6M 107M 672MSwap: 10G0B 10G[root@Dxk ~]# swapon -s文件名类型大小已用权限/dev/sdb1partition41932760-2/dev/dm-1partition39075800-3/dev/dm-3partition20971480-4/root/swap.imgfile10485720-5

关闭指定交换分区

[root@Dxk ~]# swapoff /dev/sdb1[root@Dxk ~]# free -htotal used freeshared buff/cache availableMem: 972M 169M 695M 7.6M 107M 676MSwap:6.7G0B 6.7G[root@Dxk ~]# swapon -s文件名类型大小已用权限/dev/dm-1partition39075800-2/dev/dm-3partition20971480-3/root/swap.imgfile10485720-

以上对交换分区的开启和关闭都是临时性的修改,在下次登录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/swappiness30

将此值改为0

临时修改该参数:

[root@Dxk ~]# echo 0 > /proc/sys/vm/swappiness [root@Dxk ~]# cat /proc/sys/vm/swappiness0

或者

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

这里我们的修改已经生效,但是如果重启系统,又会变成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 ~]# rebootWARNING! The remote SSH server rejected X11 forwarding request.Last login: Mon Oct 19 17:56:25 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 testfilehello 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 WORLDhello 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= # 设置发信人邮箱和昵称set smtp= # 这里填入smtp地址set smtp-auth-user=qq号@ # 这里输入邮箱账号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@Hello,How are you?EOT#此邮件题目为MyFirstPost;内容是:Hello,How are you?;发送给:916719080@

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

第二种方法:使用管道

echo “邮件内容” | mail -s test 收件人邮箱地址

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

#第三种方法,以file的内容为邮件内容发信

mail -s test 收件人邮箱地址 < file

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

四、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 -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 二 -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

【例 2】

两天后的上午8点执行 top命令

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

【例 4】

查看待处理任务

[root@Dxk init.d]# atq3Thu Oct 22 08:00:00 a root

【例 4】

删除待处理任务

[root@Dxk init.d]# at 5:00pm at> echo "123456" > filetestat> <EOT>job 4 at Tue Oct 20 17:00:00 [root@Dxk init.d]# atq3Thu Oct 22 08:00:00 a root4Tue Oct 20 17:00:00 a root[root@Dxk init.d]# atrm 4[root@Dxk init.d]# atq3Thu Oct 22 08:00:00 a root

【例 5】

根据任务ID查看具体内容

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

【例 6】

一分钟后执行/root/date文件中的内容

[root@Dxk ~]# vim date[root@Dxk ~]# cat /root/date#!bin/bashdate "+%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 [root@Dxk ~]# atq#查看该任务是否设置成功3Thu Oct 22 08:00:00 a root5Tue Oct 20 16:20:00 a root[root@Dxk ~]# date 10月 20日 星期二 16:19:59 CST[root@Dxk ~]# cat /root/date.log #一分钟后查看/root/date.log中的内容,验证任务是否执行成功-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 个“”的具体含义如下所示。

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

crontab语法格式:

举例:

当“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/dxkcat: /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 -e30 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/rootcat: /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/ls30 22 * * * /sbin/shutdown -h now

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

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

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

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

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

2.系统周期性任务

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

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

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

[root@Dxk ~]# cat /etc/crontabSHELL=/bin/bash#标识使用哪种ShellPATH=/sbin:/bin:/usr/sbin:/usr/bin#指定PATH环境变量。crontab使用自己的PATH,而不使用系统默认的PATHMAILTO=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@ < /home/dxk/file ——用户是dxk,且每小时执行一次指令mail发送邮件……

(2)目录形式

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

例如:

[root@Dxk etc]# cd croncron.d/ cron.denycron.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/bashecho "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 hellohellohellohello

基本上,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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。