Ubuntu设置定时任务——每10秒钟执行一次命令(修改文件权限)

喜欢ヅ旅行 2023-07-18 14:07 73阅读 0赞

先吐槽一下:太难了!为什么要让一个菜鸡做这种事情?
watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MTM2NA_size_16_color_FFFFFF_t_70

一、业务需求

业务需求是这样的:

  • 前端上传到服务器指定文件夹中一些视频文件,使用流媒体播放
  • 但是无法访问,原因是权限不足
  • 可以通过命令修改文件夹的权限从而使外界可以访问到该资源
  • 但是不可能让一个人看到有一个视频上传来了就执行一次命令
  • 所以使用定时任务,指定时间之内就执行一次命令修改文件夹的权限

缺点就是:

  • 有时候几天都不会有一个视频上传,而频繁的执行命令显然会造成资源浪费

这也是下下策,谷歌到的解决方案是修改 Tomcat 的配置文件或者修改 nginx 的配置文件,可是我们这个项目这两个都没有用到······

二、解决方案

我太菜了,智能选择最菜的方式解决问题,就是暴力法。

每隔十秒钟就执行一个命令修改文件夹的权限,这样碰巧有新的文件传上来了,根据正态分布,大概只需要等待 5 秒钟的时间就可以访问到该资源。

三、代码编写

1、编写脚本

先把解决实现过程放在这,着急赶业务的可以直接拿走使用,想进一步了解点知识的往下看。

我的静态资源的文件的位置:

  1. /root/hr/video

首先编写一个 shell 脚本文件:

  1. cd /root/hr
  2. vim mod.sh

这里为了和其他的文件区分使用了sh后缀.。

进去之后编写你想执行的命令,这里因为我想更改文件夹的权限,所以写一个命令如下:

  1. sudo chmod 777 * -R /root/hr/video

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MTM2NA_size_16_color_FFFFFF_t_70 1
如图所示,保存退出就可以了。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MTM2NA_size_16_color_FFFFFF_t_70 2
就是这一个文件,目前就是一个可执行文件了,可以通过 sh 命令或者 ./mod.sh 执行。

到此为止我们的命令就编写好了,下面编写定时任务:

2、编写定时任务

一般系统会自带一个 crontab ,这个就可以用来执行定时任务,简单起见我们就是用这一个程序了。

首先执行命令看一下状态:

  1. sudo service cron status

如图:
watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MTM2NA_size_16_color_FFFFFF_t_70 3
如果你也是 running ,就可以跟着我往下走了。

然后执行命令编写我们的定时任务:

  1. crontab -e

初次使用会让你选择文本编辑器,默认是 nano ,但是我只会用 vim ,所以选择 3,如图:
watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MTM2NA_size_16_color_FFFFFF_t_70 4
然后在最后插入以下内容就可以了:

  1. * * * * * /root/hr/mod.sh
  2. * * * * * sleep 10; /root/hr/mod.sh
  3. * * * * * sleep 20; /root/hr/mod.sh
  4. * * * * * sleep 30; /root/hr/mod.sh
  5. * * * * * sleep 40; /root/hr/mod.sh
  6. * * * * * sleep 50; /root/hr/mod.sh

输入下面的命令可以查看定时器目前在运行的任务:

  1. crontab -l

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MTM2NA_size_16_color_FFFFFF_t_70 5

四、原理解释

前面都是实操,没啥用,这里才是干货。

Cron 服务命令:

  1. # 查看服务状态
  2. sudo service cron status
  3. # 开启服务
  4. sudo service cron start
  5. # 停止服务
  6. sudo service cron stop
  7. # 重启服务
  8. sudo service cron restart

设置定时任务

  1. # 如果服务没有开启,开启该服务
  2. sudo service cron restart
  3. # 输入该命令,修改crontab配置。第一次输入该命令时,会提示选择编辑工具,一般选择vim(vi)即可。
  4. crontab e
  5. # 在上一步打开的终端中(第一次使用该命令的话,在选择编辑工具后),输入下面的内容
  6. # 该内容表示,在每天的0点0分,执行脚本MakeProject.sh
  7. 0 0 * * * /home/linduo/Project/MakeProject.sh

Crontab定时任务命令格式

  1. # 格式如下
  2. # minute hour day-of-month month-of-year day-of-week commands
  3. # 00-59 00-23 01-31 01-12 0-6 (0 is sunday)
  4. # 每天0点0分,执行指定脚本
  5. 0 0 * * * /home/linduo/Project/MakeProject.sh
  6. # 星期1到星期5,11点30分,执行指定脚本
  7. 30 11 * * 1,2,3,4,5 /home/linduo/Project/MakeProject.sh
  8. # 星期1、星期3、星期5,23点00,执行指定脚本,并将内容重定向到文件(使用日期命名)
  9. # 获取日期命令,必须使用如下格式,否则会导致cron执行失败。
  10. 00 23 * * 1,3,5 /home/linduo/Project/MakeProject.sh all >> "/home/linduo/Project/Build_$(date +"\%Y-\%m-\%d")".log 2>&1

但是现在才是指定一个固定的时间,比如明天 8 执行这个命令,但是如果我们是想要服务器每隔一段时间去刷新该怎么写呢?

首先 crontab 任务配置基本格式:

  1. * *  *  *  *  command
  • 第1列表示分钟0~59 每分钟用*或者 */1表示
  • 第2列表示小时0~23(0表示0点)
  • 第3列表示日期1~31
  • 第4列表示月份1~12
  • 第5列标识号星期0~6(0,7都可表示星期天)
  • 第6列要运行的命令

crontab 中增加延迟30秒来实现,就是延迟加载

  1. * * * * * /root/hr/mod.sh
  2. * * * * * sleep 30; /root/hr/mod.sh

看懂了吗?其实就是将一分钟平分为几块,如果你想 30 秒就平分为两块写一次 sleep,如果想 10 秒就是平分为 6 次,写 5 个 sleep ,同理 20 秒就是平分为 3 个,写 2 个 sleep,一次类推。

所以如果你想 5 秒钟执行一个,就是11sleep

  1. * * * * * /root/hr/mod.sh
  2. * * * * * sleep 5; /root/hr/mod.sh
  3. * * * * * sleep 10; /root/hr/mod.sh
  4. * * * * * sleep 15; /root/hr/mod.sh
  5. * * * * * sleep 20; /root/hr/mod.sh
  6. * * * * * sleep 25; /root/hr/mod.sh
  7. * * * * * sleep 30; /root/hr/mod.sh
  8. * * * * * sleep 35; /root/hr/mod.sh
  9. * * * * * sleep 40; /root/hr/mod.sh
  10. * * * * * sleep 45; /root/hr/mod.sh
  11. * * * * * sleep 50; /root/hr/mod.sh
  12. * * * * * sleep 55; /root/hr/mod.sh

参考文献:
1、Ubuntu crontab定时执行shell脚本
2、踩坑记录-crontab每10秒执行一次
3、crontab中如何设置每30秒执行一次任务

发表评论

表情:
评论列表 (有 0 条评论,73人围观)

还没有评论,来说两句吧...

相关阅读