目录
★ 很好用的一个工具 crontab执行时间计算 - 在线工具
一.at命令的使用
安装 at 命令
一般来讲,大部分 Linux 发行版都已经安装了 at
命令,不确定的话可以使用 at -V
命令查看,如果有版本返回,说明就可以正常使用 at
命令。
$ at -V
at version 3.1.13
你可能还需要启动 at 守护进程,称为 atd
。 在大多数 Linux 系统上,你可以使用 systemctl
命令启用 atd
服务并将它们设置为从现在开始自动启动:
$ sudo systemctl enable --now atd
at 命令基本用法
1.语法
at [选项] [日期时间]
2.选项
-f:指定包含具体指令的任务文件
-q:指定新任务的队列名称
-l:显示待执行任务的列表
-d:删除指定的待执行任务
-m:任务执行完成后向用户发送 E-mail
3.参数
日期时间:指定任务执行的日期时间
使用 at 命令交互性安排任务
想想看,我们平时是怎么使用闹钟这个工具的?首先我们点击闹钟软件上的加号,然后再设定时间,再在备注里输入闹钟的目的。
使用 at 命令交互性安排任务也是一样的道理。首先你输入 at 命令,然后再跟上具体的时间。
回车之后就进入到交互性界面,你再具体输入要做的事情(命令),最后以 结束输入,任务就设置好了。
例如,你想在早上 11:20 的时候,在 at-test.txt 文档里写入 hello world 这句话,可以这样交互性输入:
$ at 11:20 AM
warning: commands will be executed using /bin/sh
at> echo "hello world" > ~/at-test.txt
at> <EOT>
job 3 at Mon Jul 26 11:20:00 2021
如上所示,at 命令使用直观和自然的时间格式。你不需要知道 24 小时制或将时间转换为 UTC 格式。通常,可以直接使用我们生活中常用的单词它就能理解,例如noon、 1:30 PM、 13:37等。
在 11:20 过后,你可以使用 cat 命令检查一下 at-test.txt 文件是否有内容写入:
$ cat ~/at-test.txt
hello world
使用 at 命令安排任务
如果你不想使用交互的方式来给 at
命令安排任务,可以使用管道将 echo
或 printf
的值传递给 at
命令。
比如,我想从现在开始一分钟后向 at-test.txt
文件写入 hello again
语句:
$ echo "echo 'hello again' >> ~/at-test.txt" | at now +1 minute
一分钟后,验证新命令是否已执行:
$ cat ~/at-test.txt
hello world
hello again
时间表达式
前面提到过,at 命令使用的是我们日常生活中所使用的时间格式,非常方便:
YYMMDDhhmm[.ss] (缩写年、月、日、小时、分钟[秒])
CCYYMMDDhhmm[.ss] (完整年、月、日、小时、分钟和[秒])
now
midnight
noon
teatime`(下午4点)
AM
PM
时间和日期可以是绝对的,也可以添加一个加号 ( + ) 使它们相对于现在。在指定相对时间时,下面这些日常生活中所使用的词汇都可以使用:minutes
hours
days
weeks
months
years
下面是一些 at 命令有效表达式的示例:
$ echo "rsync -av /home/tux me@myserver:/home/tux/" | at 3:30 AM tomorrow
$ echo "/opt/batch.sh ~/Pictures" | at 3:30 AM 08/01/2022
$ echo "echo hello" | at now + 3 days
查看 at 任务队列
随时时间的推移,我们可以忘记在 at
命令队列时设置了多少个任务,如果你想进行查看,可以使用 atq
命令:
$ atq
10 Thu Jul 29 12:19:00 2021 a tux
9 Tue Jul 27 03:30:00 2021 a tux
7 Tue Jul 27 00:00:00 2021 a tux
要从队列中删除任务,请使用 atrm
命令和任务编号。例如要删除任务 7 :
$ atrm 7
$ atq
10 Thu Jul 29 12:19:00 2021 a tux
9 Tue Jul 27 03:30:00 2021 a tux
如果想要查看计划任务中的具体内容,就必须查看 at spool
。只有 root 用户才能查看at
spool,因此你必须使用 sudo
来查看 spool
或 cat
任务的内容。
小结
at
命令是避免忘记在将来特定时间的任务或在你离开时让计算机为你运行任务的非常好的方式。与 cron
命令不一样的是,它不需要使任务从现在一直循环运行,因此它的语法比 cron
简单得多。
二.crontab配置
crontab介绍:
Linux crontab是用来crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρ?νο?),原意是时间。通常,crontab储存的指令被守护进程激活,crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。当安装完成操作系统之后,默认便会启动此任务调度命令。crond 命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。
注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。
1.使用yum命令安装Crontab:
yum install vixie-cron
yum install crontabs
注:vixie-cron软件包是cron的主程序;
crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。
cron是linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:
/sbin/service crond start #启动服务
/sbin/service crond stop #关闭服务
/sbin/service crond restart #重启服务
/sbin/service crond reload #重新载入配置
2.查看Crontab状态:
service crond status
ntsysv #查看crontab服务是否已设置为开机启动
chkconfig –level 35 crond on #加入开机自动启动
3.添加定时任务:
crontab -e #编辑cron任务模式
i #默认文字编辑器为vim,按i字母键即可添加cron任务
30 3 * * * /usr/local/etc/rc.d/lighttpd restart #将命令代码放入,此命令意义为每天的03:30 重启apache
ESC #按ESC键退出编辑模式
:wq #键入:wq保存
service crond restart #重启crontab服务
4.查看任务列表:
crontab -l
5.Crontab相关命令:
(1)语 法:
crontab [-u <用户名称>][配置文件] 或 crontab { -l | -r | -e }
-u #<用户名称> 是指设定指定<用户名称>的定时任务,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的定时任务。
-l #列出该用户的定时任务设置。
-r #删除该用户的定时任务设置。
-e #编辑该用户的定时任务设置。
(2)命令时间格式 :
* * * * * command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
(3)一些Crontab定时任务例子:
30 21 * * * /usr/local/etc/rc.d/lighttpd restart #每晚的21:30 重启apache
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart #每月1、10、22日的4 : 45重启apache
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart #每周六、周日的1 : 10重启apache
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart #每天18 : 00至23 : 00之间每隔30分钟重启apache
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart #每星期六的11 : 00 pm重启apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart #晚上11点到早上7点之间,每隔一小时重启apache
* */1 * * * /usr/local/etc/rc.d/lighttpd restart #每一小时重启apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart #每月的4号与每周一到周三的11点重启apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart #一月一号的4点重启apache
*/30 * * * * /usr/sbin/ntpdate cn.pool.ntp.org #每半小时同步一下时间
0 */2 * * * /sbin/service httpd restart #每两个小时重启一次apache
50 7 * * * /sbin/service sshd start #每天7:50开启ssh服务
50 22 * * * /sbin/service sshd stop #每天22:50关闭ssh服务
0 0 1,15 * * fsck /home #每月1号和15号检查/home 磁盘
1 * * * * /home/bruce/backup #每小时的第一分执行 /home/bruce/backup这个文件
00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \; #每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。
30 6 */10 * * ls #每月的1、11、21、31日是的6:30执行一次ls命令
6.部分脚本无法执行问题:
如果我们使用 crontab 来定时执行脚本,无法执行,但是如果直接通过命令(如:./test.sh)又可以正常执行,这主要是因为无法读取环境变量的原因。
解决方法:
(1)所有命令需要写成绝对路径形式,如: /usr/local/bin/docker。
(2)在 shell 脚本开头使用以下代码:
#!/bin/sh
. /etc/profile
. ~/.bash_profile
(3)在 /etc/crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得环境变量生效,例如:
20 03 * * * . /etc/profile;/bin/sh /var/www/wwwroot/test.sh
7.Crontab默认调度任务:
cron默认配置了调度任务,分别为:hourly、daily、weekly、mouthly,默认配置文件为/etc/anacrontab
将需要执行的脚本放到相应的目录下即可,目录分别为:
/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/ect/cron.mouthly
8.注意清理系统用户的邮件日志:
每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。
例如,可以在crontab文件中设置如下形式,忽略日志输出:
0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1
“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。
9.Crontab日志路径:
ll /var/log/cron* #/var/log/cron只会记录是否执行了某些计划的脚本,但是具体执行是否正确以及执过程中的一些信息则linux会每次都发邮件到该用户下。
10.Crontab命令在线验证工具:
★ 很好用的一个工具 crontab执行时间计算 - 在线工具
三.在两台Linux上部署chrony服务
常见的时间同步工具有:chrony、ntp、openntpd;RHEL7版本以后默认支持chrony;
三种工具的详细区别参考
https://chrony.tuxfamily.org/comparison.html
chrony包含两个程序:chronyd和chronyc,其中chronyd是守护进程,用于调整内核运行时间和时钟服务器同步;用于监视 chronyd 的性能并在运行时更改各种操作参数;
二、安装Chrony服务
[root@kmi-dawufiep ~]# yum install chrony -y
[root@kmi-dawufiep ~]# systemctl enable chronyd.service
[root@kmi-dawufiep ~]# systemctl restart chronyd.service
[root@kmi-dawufiep ~]# systemctl status chronyd.service
在防火墙开启的情况下,需要开发ntp服务通过(ntp使用UDP端口123)
[root@kmi-dawufiep ~]# firewall-cmd --add-service=ntp --permanent
[root@kmi-dawufiep ~]# firewall-cmd --reload
三、配置Chrony服务
chrony配置文件:/etc/chrony.conf
#时间同步公共服务器地址。以server开头,理论上可以添加多个时间服务器地址
# These servers were defined in the installation:
server ntp.ntsc.ac.cn iburst
server cn.ntp.org.cn iburst
server time.pool.aliyun.com iburst
server time1.aliyun.com iburst
server time2.aliyun.com iburst
server time1.cloud.tencent.com iburst
server time2.cloud.tencent.com iburst
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
# 根据实际时间计算出服务器增减时间的比率,然后记录到一个文件中,在系统重启后为系统做出最佳时间补偿调整。
# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift
# chronyd根据需求减慢或加速时间调整,
# 在某些情况下系统时钟可能漂移过快,导致时间调整用时过长。
# 该指令强制chronyd调整时期,大于某个阀值时步进调整系统时钟。
# 只有在因chronyd启动时间超过指定的限制时(可使用负值来禁用限制)没有更多时钟更新时才生效。
# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3
# 将启用一个内核模式,在该模式中,系统时间每11分钟会拷贝到实时时钟(RTC)。
# Enable kernel synchronization of the real-time clock (RTC).
rtcsync
# 通过使用hwtimestamp指令启用硬件时间戳
# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *
# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2
# 指定一台主机、子网,或者网络以允许或拒绝NTP连接到扮演时钟服务器的机器
# Allow NTP client access from local network.
#allow 192.168.0.0/16
# Serve time even if not synchronized to a time source.
#local stratum 10
# 指定包含NTP验证密钥的文件。
# Specify file containing keys for NTP authentication.
#keyfile /etc/chrony.keys
# 指定日志文件的目录。
# Specify directory for log files.
logdir /var/log/chrony
# Select which information is logged.
#log measurements statistics tracking
调整公共服务器地址模块,中国国内时间同步服务器地址可参考:https://dns.icoa.cn/ntp/
四、配置时区
1.查看时间日期、时区、NTP状态
[root@kmi-dawufiep ~]# timedatectl
Local time: 四 2021-05-06 16:16:09 CST
Universal time: 四 2021-05-06 08:16:09 UTC
RTC time: 四 2021-05-06 08:16:09
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
2.查看时区列表
[root@kmi-dawufiep ~]# timedatectl list-timezones | grep -E "Asia/S.*"
Asia/Sakhalin
Asia/Samarkand
Asia/Seoul
Asia/Shanghai
Asia/Singapore
Asia/Srednekolymsk
3.修改时区为亚洲/上海时区
[root@kmi-dawufiep ~]# timedatectl set-timezone Asia/Shanghai
4.设置硬件时间(默认为UTC:0/1)
[root@kmi-dawufiep ~]# timedatectl set-local-rtc 0
5.启用NTP时间同步
[root@kmi-dawufiep ~]# timedatectl set-ntp true
6.校准时间服务器
[root@kmi-dawufiep ~]# chronyc tracking
Reference ID : 8BC7D7FB (139.199.215.251)
Stratum : 3
Ref time (UTC) : Thu May 06 08:25:54 2021
System time : 0.000144202 seconds fast of NTP time
Last offset : +0.000068143 seconds
RMS offset : 0.001500069 seconds
Frequency : 5.699 ppm slow
Residual freq : +0.007 ppm
Skew : 1.656 ppm
Root delay : 0.015710194 seconds
Root dispersion : 0.006367063 seconds
Update interval : 5.0 seconds
Leap status : Normal
7.查看时间同步状态
[root@kmi-dawufiep ~]# timedatectl status
Local time: 四 2021-05-06 16:28:41 CST
Universal time: 四 2021-05-06 08:28:41 UTC
RTC time: 四 2021-05-06 08:28:40
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
8.常用命令
查看时间同步源状态
[root@kmi-dawufiep ~]# chronyc sourcestats -v
[root@kmi-dawufiep ~]# chronyc sources -v
查看ntp server 是否在线
[root@kmi-dawufiep ~]# chronyc activity -v
查看ntp详细信息
[root@kmi-dawufiep ~]# chronyc tracking -v
调整配置/etc/chrony.conf,需要重启服务生效
四.对称加密与非对称加密
1.密码学的发展
加密的发展史随着人类的进化逐步复杂、严谨也更安全,对于早期的移位和字母对应等加密方式我们不难理解。
移位 : 比如恺撒密码, 简单点说将 26个英文字母的顺序打乱,得到一个新的字母顺序,之后的英文或是拼英组成的单词就无法直接看出是什么了。
字母对应 :比如使用一个密码本, 原文通过对应的字母进行转换。
后来出现了更高级的使用密钥的方式加密,加密和解密使用相同的密钥, 密钥越长,解密就越难。 到1976年出现了非对称加密。
2.加密的分类
按照密文是否可以被还原,可以将加密分为可逆加密和不可逆加密。严格意义上说,不可逆加密应该算不上加解密的范畴,但是实际开发过程中,还是会使用到使用不可逆加密的方法对某些信息进行加密,比如用户的登录密码。
不可逆加密和可逆加密
不可逆加密: 信息摘要和安全散列。将任意大小的原始数据变换成规定长度的输出,获取内容的数字指纹。算法比如MD5,SHA1,PBKDF2,bcrypt。
可逆加密: 基于算法,可逆加密又分为对称加密和非对称加密。
对称加密和非对称加密
对称加密: 加密密钥和解密密钥相同
非对称加密: 加密密钥和解密密钥不相同
在对称加密中,密钥就是一个数字,长度越长, 破解越困难除了公钥加密,私钥解密;也可以使用私钥加密,公钥解密。两者都有着实际的应用。
公钥加密,私钥解密。主要用于通信
私钥加密(签名),公钥解密(验证), 用于数字签名
3.加密算法汇总
不同的加密类型,对应的加密算法有:
基于算法的加密算法, 也称为古典加密算法, 比如base64, 比特币生成地址使用的base58。 这类算法对原始内容进行置换和替换得到密文, 安全性依赖于算法是否外泄。
对称加密算法。 加解密使用同一个密钥。算法常见的有DES、3DES、AES。安全性从依赖算法转向依赖于密钥。
非对称加密。 加解密使用同不同的密钥。常见算法:RSA, DH , ECC。
对称加密 非对称加密
DES , AES ,3DES,PBE RSA ,DH, ECC
DES已经被AES所取代
4.对称加密算法
DES , 数据加密算法
DEA( Data Encryption Algorithm, 数据加密算法)。
1997 年 DES标准正式发布, 分组长度64比特,其中8比特为奇偶校验位, 所以实际长度为56比特。
DES密钥的实质长度是56比特(7个字节)。
示例:二进制: 01010001 11101100 01001011 00010010 00111101 01000010 00000010
十六进制:51 EC 4B 12 3D 42 02
十进制:2305928028626269954
可以使用两个DES密钥(DES-EDE2)和三个DES密钥(DES-EDE3)。DES-EDE2长度112比特(14个字节),DES-EDE3长度168比特(21字节)。
示例:DES-EDE2: 51 EC 4B 12 3D 42 03 30 04 D8 98 95 93 3F
DES-EDE3: 51 EC 4B 12 3D 42 03 30 04 D8 98 95 93 3F 24 9F 61 2A 2F D9 96
AES
密钥长度可以从128、192和256个比特中选择。PBE 基于口令的密码
PBE ( Password Based Encryption, 基于口令的密码)。是一种基于口令生成密钥, 并使用该密钥进行加密的方法。
加密和解密使用的是同一个密钥。如同饭菜上加盐会改变饭菜的味道, 口令中加盐会改变生成的KEK值。
KEK (Key Encryting Key,密钥加密密钥), 将盐和口令通过单向散列函数, 得到的散列值就是用来加密密钥的密钥。
在Java语言中使用PBE 加密可以参考:
Java使用PBE算法进行对称加解密最简入门和示例
5.非对称加密的理解
非对称加密来源于数学中的大质因数分解很难的问题,基于欧几里得的证明, 每个数只有一种质因数分解, 一个大整数分解成一堆质数很难。
理解非对称加密, 需要回顾一下下面的数学概念:素数:又称质数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。
互质,又称互素。若N个整数的最大公因子是1,则称这N个整数互质。
模运算即求余运算。比如 10%3 , 10除以3的余数是1, 所以求模的结果是1。
欧拉函数
任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?
计算这个值的方法就叫做欧拉函数,以φ(n)表示举例来说:
对于一个很小的数 7, 分解为两个质因数的乘积很容易。但是对于一个大一点的数 589 就很难直接得到答案了(589 =19*31),如果一个更大的数呢?比如54225。
以RSA算法为例,公钥与私钥虽然是一对密钥,但密钥值不同,这对密钥值的生成就建基于大素数的乘积与分解上。如果上面对非对称加密还不够了解的话,也可以从颜色的角度理解非对称加密的公私钥。
颜色的比喻
混合颜色是一个单向函数, 两个颜色混合输出第三种颜色很简单, 但是反过来就很难。首先了解一下什么是互补色:每个颜色都有一个互补色,两个互补色叠加得到白光。
张三选了两个互补的颜色, 将其中一个作为公钥发给李四
李四选了一个颜色, 他将这个颜色和张三混合色的颜色发给张三
张三使用自己保留的颜色,叠加到李四的混合色上面。就得到了李四的颜色。
即使李四混合后的颜色被别人知道了, 也很难破译出李四的颜色。
6.对称加密和非对称加密的优缺点和应用
对称加密速度快
非对称加密更安全
非对称加密在实际中会结合对称加密使用。常用的使用非对称算法获得共享密钥,使用对称加密处理数据。这也是https 采用的方式。