惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
D
Docker
Microsoft Security Blog
Microsoft Security Blog
Google DeepMind News
Google DeepMind News
M
MIT News - Artificial intelligence
P
Proofpoint News Feed
Engineering at Meta
Engineering at Meta
Y
Y Combinator Blog
Vercel News
Vercel News
F
Fortinet All Blogs
B
Blog
Recent Announcements
Recent Announcements
A
About on SuperTechFans
GbyAI
GbyAI
T
The Blog of Author Tim Ferriss
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - Franky
MongoDB | Blog
MongoDB | Blog
Stack Overflow Blog
Stack Overflow Blog
B
Blog RSS Feed
C
Check Point Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
Visual Studio Blog
月光博客
月光博客

梦魇小栈

《羊了个羊》程序员过关攻略 WebRTC 入门指南 将你的博客升级为 PWA 渐进式Web离线应用 什么? 微信没有年度账单? 前端 nodejs 撸起来~ [接口实现] Hexo 博客美化代码块 记一下 pm2 常用配置及命令 (译)NPM vs Yarn 备忘手册 用 MySQL 导入 SQL 文件 解决 ubuntu 服务器中文乱码 面试分享:2018阿里巴巴前端面试总结(题目+答案) SED 命令简明教程 在Hexo博客 NexT主题中部署Wildfire评论系统 使用 JavaScript 实现简单的拖拽 Merry Christmas JAVASCRIPT生成图形验证码 笔记:NPM版本号自增,自动化发布NPM包 不可不知的Mac OS X专用命令行工具(持续更新中) 继多说、网易关停之后该何去何从(网易云跟帖宣布2017年8月1日停止服务) 重新介绍 JavaScript(JS全面系列教程)
crontab 踩坑之绝对路径
Ihoey 心,若没有栖息的地方,到哪里都是流浪...... · 2018-02-13 · via 梦魇小栈

发表于 | 更新于 | 分类于 Linux | 评论数: | 阅读次数:

由于放假后网络原因不方便使用电脑,需要创建一个 crontab 定时任务,用来在每天固定时间执行一个 Shell 脚本

过程

添加计划任务

1
2
3
4
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=-~" # 每天九点半执行一次

重启计划任务

1
sudo service crond start

到了时间以后发现第一个没有反应,第二个是有效的,后来一步步排查问题发现问题

问题

Shell 脚本中,有对该脚本所在目录的相关文件进行操作的逻辑,在一开始实现时,对当前目录的文件操作时都是使用的相对目录,即 ./* 。在终端直接 sh 执行时没有任何问题,正常结束,而一旦在 crontab 中定时执行时,就出现问题,如提示 file not found 或者没有任何输出等错误。

之前的脚本内容是

1
2
3
4
echo "test" >> temp.txt
git add .
git commit -m"更新"
git push origin master

解决问题

出现问题后,我在脚本中试着打印出 crontab 执行时的当前目录,如 curPath=$(pwd) ,执行后发现,打印出的结果为 $HOME 的目录,而非脚本所在的原始目录,这就造成了在脚本中使用相对路径时出现找不到的情况。

找到问题后,解决方法有两个:

  • 将相对路径替换为绝对路径。(ps:如脚本中包含某些Shell命令,且命令的某些参数为默认当前目录的,都需要显式的给出绝对路径)
  • 在操作相对路径之前,使用 cd /....../ ,在执行脚本时强制进入到该目录。
1
2
3
4
5
6
cd /root/home/

echo "test" >> temp.txt
git add .
git commit -m"更新"
git push origin master

排查问题可以查看日志来看是否执行

1
2
3
4
5
6
7
8
#编辑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 命令来使配置生效。

满分是10分的话,这篇文章你给几分,您的支持将鼓励我继续创作!

0%