目录
一、计划任务
按照计划准时准点去执行任务
任何脚本都可以配合计划任务来执行,做到定时完成某些事情
1.1 【导入】游戏服务器资源分析
1.2 为什么需要计划任务
可以自动执行,不需要人干预,解放了人力,提高工作效率
1.3 Linux里的计划任务
crond进程:负责Linux里执行计划任务的程序,在内存里一直运行的程序(守护进程)。不要关闭
每隔一分钟去检查Linux系统里的计划任务,最短时间间隔:一分钟
使用crontab命令调用crond进程,设置按固定周期(如每天、每周等)重复执行预先计划好的任务。
#查看crond进程是否存在
[root@localhost ~]# ps aux|grep crond
root 698 0.0 0.1 126384 1672 ? Ss 15:46 0:00 /usr/sbin/crond -n
root 1857 0.0 0.0 112824 988 pts/0 R+ 16:58 0:00 grep --color=auto crond
#重启
[root@localhost ~]# service crond restart
Redirecting to /bin/systemctl restart crond.service
#停止
[root@localhost ~]# service crond stop
#在centos7中真正执行的命令
Redirecting to /bin/systemctl stop crond.service
#启动
[root@localhost ~]# service crond start
Redirecting to /bin/systemctl start crond.service
【注】systemctl stop crond和service crond stop时等价的
1.4 创建计划任务
(Linux系统里可以定制很多计划任务,一行一个计划任务)
crontab是创建计划任务的命令
crontab -e 编辑计划任务
crontab -l 查看计划任务
1.4.1 cron命令格式
【格式如下:15行】
[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=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
[root@localhost ~]#
* 表示任意时间
1.4.2 时间数值的表示方法
【翻译时间从右到左】
===示例
0 17 * * 1-5 ==》周一到周五每天17:00
30 8 * * 1,3,5 ==》周一、三、五的8:30
0 8-18 * * * ==》每天8点到18点整
0 12 */3 * * ==》每隔3天的12点整
===
1.4.3 实例+具体操作
【题目】
每天23:00备份一次,使用计划任务执行
备份脚本:/root/lianxi/backup_log.sh
【步骤】
[root@localhost lianxi]# crontab -e
第一步:按i进入计划任务的编辑模式,输入以下内容
0 23 * * * /root/lianxi/backup_log.sh
第二步:按Esc,输入:wq 退出并且保存
[root@localhost lianxi]# crontab -l 查看计划任务
0 23 * * * bash /root/lianxi/backup_log.sh
1.4.4 普通用户创建计划任务
1. lihua用户自己创建计划任务
[root@localhost cron]# su - lihua
上一次登录:三 3月 16 21:55:16 CST 2022pts/0 上
[lihua@localhost ~]$ crontab -e
2. root用户帮助lihua用户创建计划任务
[root@localhost cron]# crontab -e -u lihua
1.4.5 练习
- 每隔一分钟新建一个文件夹,这个文件名里需要包含当前时间,精确到秒
- 新建的文件夹保存在/root/lianxi/sanchuang
- 脚本名字create_dir.sh
需求分析
- 编写脚本实现新建文件夹,名字里包含当前的时间,精确到秒==》mkdir 和 date +%Y%m%d%H%M%S
- 脚本名字create_dir.sh,存放在/root/lianxi/sanchuang
- 制定计划任务,实现每一分钟执行上面的create_dir.sh脚本
【答案】
时间格式==》*/1 * * * * bash /root/lianxi/sanchuang/create_dir.sh 或 * * * * * bash /root/lianxi/sanchuang/create_dir.sh
[root@localhost sanchuang]# vim create_dir.sh
[root@localhost sanchuang]# cat create_dir.sh
#!/bin/bash
#获得当前时间
ctime=$(date +%Y%m%d%H%M%S)
#新建文件夹
mkdir -p /root/lianxi/sanchuang/lihua_$ctime
[root@localhost sanchuang]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@localhost sanchuang]# crontab -l
*/1 * * * * bash /root/lianxi/sanchuang/create_dir.sh
1.5 同一时间可以做多个计划任务吗
答:可以,方法一:一行一个计划任务,时间点相同。方法二:都写到一个脚本中,直接做一个计划任务。
建议:最好不要同时做很多事情,会在一个时间点消耗服务器的cpu、内存、磁盘、带宽等资源。会给服务器造成很大压力。
1.6 如何判断计划任务是否执行
【注:希望某个计划任务不执行时,可以加#注释掉】
[root@localhost sanchuang]# ls
create_dir.sh lihua_20220316200601 lihua_20220316200901
lihua_20220316200401 lihua_20220316200702 lihua_20220316201001
lihua_20220316200501 lihua_20220316200801 lihua_20220316201101
[root@localhost sanchuang]# crontab -e
crontab: installing new crontab
[root@localhost sanchuang]# rm -rf lihua*
[root@localhost sanchuang]# ls
create_dir.sh
[root@localhost sanchuang]# date
2022年 03月 16日 星期三 20:12:40 CST
[root@localhost sanchuang]# date
2022年 03月 16日 星期三 20:14:27 CST
[root@localhost sanchuang]# ls
create_dir.sh
[root@localhost sanchuang]# crontab -l
#*/1 * * * * bash /root/lianxi/sanchuang/create_dir.sh
1.6.1 直接看效果
1.6.2 看日志文件
日志:程序会记录发生的事情到文件里
crontab的日志:记录哪些计划任务的生成、执行、修改等操作 ==》/var/log/cron
CROND[22491] CROND时进程 [22491]时crond的进程好 pid号
CMD表示执行命令command
192表示用户,前面表示时间
[root@localhost log]# tail -f cron
Mar 16 20:18:01 192 crontab[2357]: (root) LIST (root) 查看
Mar 16 20:18:13 192 crontab[2358]: (root) BEGIN EDIT (root) 编辑
Mar 16 20:18:21 192 crontab[2358]: (root) REPLACE (root) 修改
Mar 16 20:18:21 192 crontab[2358]: (root) END EDIT (root) 结束编辑
Mar 16 20:19:01 192 crond[702]: (root) RELOAD (/var/spool/cron/root) 加载计划任务开始执行
Mar 16 20:19:01 192 CROND[2363]: (root) CMD (bash /root/lianxi/sanchuang/create_dir.sh) 脚本的执行输出效果
1.7 前台、后台
计划任务是在后台执行的,人看不到
前台:我们看得到的界面
后台:Linux系统的背后执行,我们看不到,但是有进程可以看到,只是无法看到界面
在Linux中命令后面接一个&符号,就是将这条命令放到后台执行
jobs:查看后台运行的有哪些程序
fg 1:将后台编号为1的程序调到前台执行
[root@localhost lianxi]# vim create_dir_v2.sh &
[1] 12406
[root@localhost lianxi]# jobs
[1]+ 已停止 vim create_dir_v2.sh
[root@localhost lianxi]# fg 1
vim create_dir_v2.sh
1.8 【黑客可能利用】计划任务的顺风车
Linux系统本身也有一些任务需要定时完成。例如:日志文件的轮转(每隔一段时间产生一个新的日志文件)。updatedb:(locate)每天自动更新一次
1.8.1 操作系统的后台工作开展需要的计划任务存放在哪里
/var/spool/cron 是存放用户的计划任务,Linux系统的后台工作开展需要的计划任务存放在哪里?
/etc下这些文件夹可以存放Linux系统的计划任务
cron.daily/ ==》存放每天需要执行的任务。若是安装了mlocate,该目录下会再加一个mlocate
cron.hourly/ ==》存放每小时需要执行的任务
cron.weekly/ ==》存放每周需要执行的任务
cron.monthly/ ==》存放每月需要执行的任务
cron.deny ==》存放拒绝执行的用户的计划任务的用户名
[root@localhost lianxi]# cd /etc/cron.
cron.d/ cron.deny cron.monthly/
cron.daily/ cron.hourly/ cron.weekly/
[root@localhost lianxi]# cd /etc/cron.daily/
[root@localhost cron.daily]# ls
logrotate man-db.cron
[root@localhost cron.daily]#
1.9 anacron服务
- 是cron服务的补充程序,起到查漏补缺的作用
- 弥补cron再系统关机后不能执行计划任务的问题,等系统开机后再将没有执行的计划任务执行一遍
- 不能代替cron
- 按天、按周或月为单位去检查系统未进行的cron任务
- /var/spool/anacron
- 开机时自动运行,然后将为执行的计划执行一遍后,anacron会自动停止
二、思考
【注】本点下计划任务示例中使用的为命令,但后续检验发现,会出现问题,需要自行换为执行脚本
【补充】$USER 用户名
[root@localhost cron]# echo $USER
root
2.1 每个用户都有自己的计划任务
[root@localhost lianxi]# useradd lihua
[root@localhost lianxi]# su - lihua
[lihua@localhost ~]$ crontab -e
no crontab for lihua - using an empty one
crontab: installing new crontab
[lihua@localhost ~]$ crontab -l
*/1 * * * * /usr/bin/mkdir -p /home/lihua/$(date +%F_%H%M%S).lihua
[root@localhost lianxi]# useradd xiaohong
[root@localhost lianxi]# su - xiaohong
[xiaohong@localhost ~]$ crontab -e
no crontab for xiaohong - using an empty one
crontab: installing new crontab
[xiaohong@localhost ~]$ crontab -l
*/1 * * * * /usr/bin/mkdir -p /home/xiaohong/$(date +%F_%H%M%S).xiaohong
2.2 这个用户没有登录是否计划任务也会执行?
答:会执行
计划任务的存放位置:
每个用户对应一个计划任务的文件
Linux中一切皆文件
crond这个进程每隔一分钟就到/var/spool/cron文件夹下加载所有的文件,执行里面的计划任务
[root@localhost log]# cd /var/spool/cron 存放任务的文件夹,和用户名对应
[root@localhost cron]# ls
lihua root xiaohong
[root@localhost cron]# cat lihua
*/1 * * * * /usr/bin/mkdir -p /home/lihua/$(date +%F_%H%M%S).lihua
[root@localhost cron]# cat xiaohong
*/1 * * * * /usr/bin/mkdir -p /home/xiaohong/$(date +%F_%H%M%S).xiaohong
2.3 root用户是否可以去管理其他用户的执行计划
默认情况下,只有root用户可以查看其他用户的计划任务,其他用户只能看自己的计划任务
2.4 🖤黑客是否会利用计划任务,如何排查?
1. 到/var/spool/cron目录下查看是否右可疑的计划任务文件;
2. 还要查看root用户本身的计划任务,是否有可疑的脚本执行
3. 还要注意查看系统的计划任务,防止黑客坐计划任务顺风车
2.5 计划任务里脚本尽量使用绝对路径
PATH变量的问题,建议使用命令的绝对路径,防止找不到
【两个PATH变量的值不一样,计划任务里的要少一些】
[root@localhost cron]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost cron]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
三、练习(最后来巩固以下所学吧)
3.1 练习1
[root@localhost ~]# crontab -e
crontab: installing new crontab
[root@localhost ~]# crontab -l
50 7 * * * bash /root/lianxi/mkdir_file.sh
50 22 * * * bash /root/lianxi/create_file.sh
0 12 */5 * * rm -rf /backup_tmp/*
30 7 * * 6 service sshd restart
30 17 * * 1,3,5 bash /root/lianxi/abc.sh
0 23 * * * bash /lianxi/backup_pwd_boot_log.sh
【注意:变量用花括号括起来,防止造成歧义】
3.2 练习2
[root@localhost ~]# useradd liangluyao
[root@localhost ~]# crontab -u liangluyao -e
no crontab for liangluyao - using an empty one
crontab: installing new crontab
[root@localhost ~]# crontab -u liangluyao -l
55 23 * * 7 bash /root/lianxi/backup_pwd.sh
#检查是否成功为用户liangluyao创建计划任务
[root@localhost ~]# cd /var/spool/cron
[root@localhost cron]# ls
liangluyao lihua root xiaohong
[root@localhost cron]# cat liangluyao
55 23 * * 7 bash /root/lianxi/backup_pwd.sh
[root@localhost lianxi]# vim backup_pwd.sh
[root@localhost lianxi]# cat backup_pwd.sh
#!/bin/bash
#使用cp命令的绝对路径,避免覆盖之前的内容时需要确认
/usr/bin/cp /etc/passwd ~liangluyao/$(date +%F)_pwd.txt
[root@localhost lianxi]# /usr/bin/cp /etc/passwd ~liangluyao/$(date +%F)_pwd.txt
[root@localhost lianxi]# ls ~liangluyao
2022-03-17_pwd.txt
【后三行】目的:检验改脚本命令是否有错
3.3 思考题
【查看】
[root@localhost ~]# cd /var/spool/cron
[root@localhost cron]# ls
liangluyao lihua root xiaohong
四、【补充】随机数
(()) 双圆括号是shell里的数学运算使用,双圆括号里可以不接$符号引用变量
% 取余
[root@localhost lianxi]# ((8%5))
[root@localhost lianxi]# echo $((8%5))
3
#得到随机数
[root@localhost lianxi]# echo $RANDOM
3945
[root@localhost lianxi]# echo $RANDOM
19030
#得到10以内的随机数
[root@localhost lianxi]# echo $((RANDOM%10))
6
#得到3以内的随机数
[root@localhost lianxi]# echo $((RANDOM%3))
1
[root@localhost lianxi]# echo $((RANDOM%3))
1
[root@localhost lianxi]# mkdir lihua$RANDOM
[root@localhost lianxi]# ls
lihua20922