linux 命令在终端能执行 丢进 crontab 就报错
终端内命令与 crontab 内命令对比
在终端输入以下命令可以直接运行,但丢进 crontab 就有问题了
echo -e "=== $(date '+%Y-%m-%d %H:%M:%S') start ===\n" >> /tmp/backup.log && cd /home/lukachen && rsync -chavzP --stats lukachen@192.168.1.1:/data/www/backup/* /home/lukachen/backup >> /tmp/backup.log 2>&1 && echo -e "=== $(date '+%Y-%m-%d %H:%M:%S') end ===\n" >> /tmp/backup.log
crontab -e
需要做一点微调:
# 每天凌晨2点10分, 跨机备份文件
10 02 * * * source ~/.bash_profile && echo -e "=== $(date '+\%Y-\%m-\%d \%H:\%M:\%S') start ===\n" >> /tmp/backup.log && cd /home/lukachen && rsync -chavzP --stats lukachen@192.168.1.1:/data/www/backup/* /home/lukachen/backup >> /tmp/backup.log 2>&1 && echo -e "=== $(date '+\%Y-\%m-\%d \%H:\%M:\%S') end ===\n" >> /tmp/backup.log
分解以上命令:
source ~/.bash_profile
易出错点:环境变量不同
解决方法:用上述 source 命令,使用当前用户环境变量,包括 alias、用户登录终端会做的一些初始化操作(如果 ~/.bash_profile 做的事情过多,这个命令一定程度上降低效率)
echo -e "=== $(date '+\%Y-\%m-\%d \%H:\%M:\%S') start ===\n" >> /tmp/backup.log
易出错点:% 在 crontab 里是特殊字符
解决方法:对 % 加反斜线转义
rsync -chavzP --stats lukachen@139.x.x.x:/data/www/backup/* /home/lukachen/backup >> /tmp/backup.log 2>&1
简单解释一下命令中 rsync 和 2>&1:
- 使用 rsync 命令,将远程机器 /data/www/backup/* 下的文件备份到 /home/lukachen/backup。rsync 可以看 rsync 发布代码 文件备份
- 这里 rsync 不需要密码,需先将本机公钥放到 139.x.x.x 上了。这部分知识可以搜索 ssh-copy-id
- 2>&1 意思是,将错误输出也重定向到 /tmp/backup.log
打赏: 微信
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
命令比较长的话我一般都单独写个 shell 文件,然后去触发 shell 文件执行,看来懒帮我避开了很多坑。
嗯,特殊字符避开了。然后尽量使用绝对路径,环境变量也要注意。
报错的原因是什么?
文内写了,看来我没写清楚。两个主要原因,一个是环境变量,另一个百分号在crontab里是关键字
嗯,因为我看你第一行的crontab里面%是已经转义了的
是的,案例里是是我实际使用中遇到问题调整过,可以直接跑的。重新编排了一下内容,希望看起来,表意能更明确。
很给力的文章,谢谢!
相互学习。