Ubuntu设置定时任务——每10秒钟执行一次命令(修改文件权限)
先吐槽一下:太难了!为什么要让一个菜鸡做这种事情?
一、业务需求
业务需求是这样的:
- 前端上传到服务器指定文件夹中一些视频文件,使用流媒体播放
- 但是无法访问,原因是权限不足
- 可以通过命令修改文件夹的权限从而使外界可以访问到该资源
- 但是不可能让一个人看到有一个视频上传来了就执行一次命令
- 所以使用定时任务,指定时间之内就执行一次命令修改文件夹的权限
缺点就是:
- 有时候几天都不会有一个视频上传,而频繁的执行命令显然会造成资源浪费
这也是下下策,谷歌到的解决方案是修改 Tomcat 的配置文件或者修改 nginx 的配置文件,可是我们这个项目这两个都没有用到······
二、解决方案
我太菜了,智能选择最菜的方式解决问题,就是暴力法。
每隔十秒钟就执行一个命令修改文件夹的权限,这样碰巧有新的文件传上来了,根据正态分布,大概只需要等待 5 秒钟的时间就可以访问到该资源。
三、代码编写
1、编写脚本
先把解决实现过程放在这,着急赶业务的可以直接拿走使用,想进一步了解点知识的往下看。
我的静态资源的文件的位置:
/root/hr/video
首先编写一个 shell 脚本文件:
cd /root/hr
vim mod.sh
这里为了和其他的文件区分使用了sh
后缀.。
进去之后编写你想执行的命令,这里因为我想更改文件夹的权限,所以写一个命令如下:
sudo chmod 777 * -R /root/hr/video
如图所示,保存退出就可以了。
就是这一个文件,目前就是一个可执行文件了,可以通过 sh 命令或者 ./mod.sh
执行。
到此为止我们的命令就编写好了,下面编写定时任务:
2、编写定时任务
一般系统会自带一个 crontab
,这个就可以用来执行定时任务,简单起见我们就是用这一个程序了。
首先执行命令看一下状态:
sudo service cron status
如图:
如果你也是 running
,就可以跟着我往下走了。
然后执行命令编写我们的定时任务:
crontab -e
初次使用会让你选择文本编辑器,默认是 nano ,但是我只会用 vim
,所以选择 3,如图:
然后在最后插入以下内容就可以了:
* * * * * /root/hr/mod.sh
* * * * * sleep 10; /root/hr/mod.sh
* * * * * sleep 20; /root/hr/mod.sh
* * * * * sleep 30; /root/hr/mod.sh
* * * * * sleep 40; /root/hr/mod.sh
* * * * * sleep 50; /root/hr/mod.sh
输入下面的命令可以查看定时器目前在运行的任务:
crontab -l
四、原理解释
前面都是实操,没啥用,这里才是干货。
Cron 服务命令:
# 查看服务状态
sudo service cron status
# 开启服务
sudo service cron start
# 停止服务
sudo service cron stop
# 重启服务
sudo service cron restart
设置定时任务
# 如果服务没有开启,开启该服务
sudo service cron restart
# 输入该命令,修改crontab配置。第一次输入该命令时,会提示选择编辑工具,一般选择vim(vi)即可。
crontab –e
# 在上一步打开的终端中(第一次使用该命令的话,在选择编辑工具后),输入下面的内容
# 该内容表示,在每天的0点0分,执行脚本MakeProject.sh
0 0 * * * /home/linduo/Project/MakeProject.sh
Crontab定时任务命令格式
# 格式如下
# minute hour day-of-month month-of-year day-of-week commands
# 00-59 00-23 01-31 01-12 0-6 (0 is sunday)
# 每天0点0分,执行指定脚本
0 0 * * * /home/linduo/Project/MakeProject.sh
# 星期1到星期5,11点30分,执行指定脚本
30 11 * * 1,2,3,4,5 /home/linduo/Project/MakeProject.sh
# 星期1、星期3、星期5,23点00,执行指定脚本,并将内容重定向到文件(使用日期命名)
# 获取日期命令,必须使用如下格式,否则会导致cron执行失败。
00 23 * * 1,3,5 /home/linduo/Project/MakeProject.sh all >> "/home/linduo/Project/Build_$(date +"%Y-%m-%d")".log 2>&1
但是现在才是指定一个固定的时间,比如明天 8 执行这个命令,但是如果我们是想要服务器每隔一段时间去刷新该怎么写呢?
首先 crontab
任务配置基本格式:
* * * * * command
- 第1列表示分钟0~59 每分钟用*或者 */1表示
- 第2列表示小时0~23(0表示0点)
- 第3列表示日期1~31
- 第4列表示月份1~12
- 第5列标识号星期0~6(0,7都可表示星期天)
- 第6列要运行的命令
crontab 中增加延迟30秒来实现,就是延迟加载。
* * * * * /root/hr/mod.sh
* * * * * sleep 30; /root/hr/mod.sh
看懂了吗?其实就是将一分钟平分为几块,如果你想 30 秒就平分为两块写一次 sleep,如果想 10 秒就是平分为 6 次,写 5 个 sleep ,同理 20 秒就是平分为 3 个,写 2 个 sleep,一次类推。
所以如果你想 5 秒钟执行一个,就是11
个sleep
:
* * * * * /root/hr/mod.sh
* * * * * sleep 5; /root/hr/mod.sh
* * * * * sleep 10; /root/hr/mod.sh
* * * * * sleep 15; /root/hr/mod.sh
* * * * * sleep 20; /root/hr/mod.sh
* * * * * sleep 25; /root/hr/mod.sh
* * * * * sleep 30; /root/hr/mod.sh
* * * * * sleep 35; /root/hr/mod.sh
* * * * * sleep 40; /root/hr/mod.sh
* * * * * sleep 45; /root/hr/mod.sh
* * * * * sleep 50; /root/hr/mod.sh
* * * * * sleep 55; /root/hr/mod.sh
参考文献: 1、Ubuntu crontab定时执行shell脚本
2、踩坑记录-crontab每10秒执行一次
3、crontab中如何设置每30秒执行一次任务
- C语言程序设计50例(一)(经典收藏)
- 程序员面试之软件测试面试问答
- 微信小程序,开发大起底
- Netty粘包拆包解决方案
- 为什么要用 Node.js
- JavaScript定时器:setTimeout与setInterval 定时器与异步循环数组
- 深入理解javascript原型和闭包(1)——一切都是对象
- 程序员面试50题(2)—二元查找树的后序遍历结果[数据结构]
- 总结了一些指针易出错的常见问题(一)
- Eureka 服务上下线监控
- 程序员面试50题(1)—查找最小的k个元素[算法]
- Netty4自带编解码器详解
- C和指针小结(C/C++程序设计)
- Netty-整合Protobuf高性能数据传输
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 中标麒麟系统Your trial is EXPIRED and no VALID licens
- R初探
- 独家 | 在Python编程面试前需要学会的10个算法(附代码)
- 为什么一个还没毕业的大学生能够把 IO 讲的这么好?
- 如何将单 master 升级为多 master 集群
- 为 Kubernetes 节点发布扩展资源
- Kubernetes 资源预留配置
- PHP一些常见的漏洞梳理
- File的基本操作
- 一文教你在Colab上使用TPU训练模型
- 如何在Docker容器中运行Docker [3种方法]
- [漏洞复现] 三.CVE-2020-0601微软证书漏洞及Windows验证机制欺骗复现
- PDF文件密码破解
- Ubuntu 制作离线源
- keycloak+istio实现基于jwt的服务认证授权