crontab 踩坑之绝对路径
时间:2022-06-13
本文章向大家介绍crontab 踩坑之绝对路径,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
由于放假后网络原因不方便使用电脑,需要创建一个 crontab
定时任务,用来在每天固定时间执行一个 Shell
脚本
过程
添加计划任务
crontab -e
* 10,19 * * * sh /root/home/cron.sh >> /root/home/temp.txt #每天10点和19点执行一次,路径一定要是绝对路径
30 9 * * * curl "https://sc.ftqq.com/SCU10625Td571049c53dd2e36148f134*****44ef59855df9df77c.send?text=-~" # 每天九点半执行一次
重启计划任务
sudo service crond start
到了时间以后发现第一个没有反应,第二个是有效的,后来一步步排查问题发现问题
问题
在 Shell
脚本中,有对该脚本所在目录的相关文件进行操作的逻辑,在一开始实现时,对当前目录的文件操作时都是使用的相对目录,即 ./*
。在终端直接 sh
执行时没有任何问题,正常结束,而一旦在 crontab
中定时执行时,就出现问题,如提示 file not found
或者没有任何输出等错误。
之前的脚本内容是
echo "test" >> temp.txt
git add .
git commit -m"更新"
git push origin master
解决问题
出现问题后,我在脚本中试着打印出 crontab
执行时的当前目录,如 curPath=$(pwd)
,执行后发现,打印出的结果为 $HOME
的目录,而非脚本所在的原始目录,这就造成了在脚本中使用相对路径时出现找不到的情况。
找到问题后,解决方法有两个:
- 将相对路径替换为绝对路径。(ps:如脚本中包含某些Shell命令,且命令的某些参数为默认当前目录的,都需要显式的给出绝对路径)
- 在操作相对路径之前,使用
cd /....../
,在执行脚本时强制进入到该目录。
cd /root/home/
echo "test" >> temp.txt
git add .
git commit -m"更新"
git push origin master
排查问题可以查看日志来看是否执行
#编辑rsyslog
sudo vim /etc/rsyslog.d/50-default.conf
#找到rsyslog中cron一行将前面的注释符#去掉
cron.* /var/log/cron.log
#重启rsyslog
sudo service rsyslog restart
# 然后查看日志,到指定时间看是否执行
tail -f /var/log/cron.log
附录
系统在执行定时任务时,是不会加载任何环境变量的,所以当脚本需要环境变量时,可以通过在脚本中添加 source /etc/profile
命令来使配置生效。
- PHP数据结构(九) ——图的定义、存储与两种方式遍历
- 使用 React 和 Django REST Framework 构建你的网站
- 小程序中带图片modal的实现
- 号称「永远不会输钱」的马丁格尔策略
- 小程序中图片高度等比缩放
- 三分钟使用 Python 处理 Nginx 日志
- Python,Shell 和 三个标准文件
- 【微信官方】获取用户信息方案介绍
- 【实战】如何使用 Python 从 Redis 中删除 4000万 KEY
- [多图] DevOps 也要懂点 Excel
- [实战篇] Python 运维中使用并发
- PHP数据结构(十) ——有向无环图与拓扑算法
- PHP数据结构(十一) ——图的连通性问题与最小生成树算法(1)
- 优化 MySQL: 3 个简单的小调整
- 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 数组属性和方法
- axios POST提交数据的三种请求方式写法
- Json对象和Json字符串的区别
- 合并/拆分 Excel?Python、VBA轻松自动化
- (数据科学学习手札96)在geopandas中叠加在线地图
- 秋天的第一杯奶茶该买哪家?Python 爬取美团网红奶茶店告诉你
- AttributeError: NoneType object has no attribute‘’
- tf.control_dependencies(control_inputs)
- tf.get_collection()
- tf.reduce_mean()
- tf.placeholder函数说明
- tf.sigmoid()用法
- Latex 表格过大(或过小)的调整方法
- Latex设置字体大小及表格中的文字大小等
- jQuery 选择器
- jQuery 介绍 以及基本使用