开发了一个登录readfree.me网站的node命令行工具,部署在一台云主机上面。想法是通过 crontab
编写一条规则:
// crontab -e
0 8 * * * rflogin
在首次登录后,就可以每日自动登录了。
这样弄好之后,观测了两天,然而事与愿违,查看readfree.me上签到记录好像少了些记录啊。
不知道所以,于是乎只能查看日志:
查看cron的执行日志:
cat /etc/log/cron | grep rflogin
执行记录
可以看到还是执行了设定的命令,然而为什么没有登录?
已经执行命令,但没有登录,有点和常理相悖论啊,我直接命令行执行rflogin
都显示登录成功的。
于是乎百度、谷歌。。心疲力尽。终究发现些蛛丝马迹,执行命令可以将输出导出到一个日志文件中:
0 8 * * * rflogin >> /var/log/rflogin.log
这个是每天8点执行,明天8点再来看看日志?开始我就是这样想的,人老了,思维定势有点伤。然而转念一想都是定时任务,每分钟执行一次不就好了,故先修改为:
// 注意千万加上 2>&1,表示将标准输出和出错信息都重定向到 rflogin.log中
// 如果没有加,我观测日志文件是为空的
0 8 * * * rflogin >> /var/log/rflogin.log 2>&1
然后查看日志这个日志文件:
cat /var/log/rflogin.log
输出一大堆我还认识东西:
/var/log/rflogin.log
这就更让我费解了,我明明是使用 npm 全局安装的, 在命令行里面都能成功,为何crontab就不行?
于是乎想到是不是命令行和crontab执行时的 $PATH
不一样:
修改一下命令:
* * * * * echo $PATH >> /var/log/rflogin.log 2>&1
然后查看日志文件:
对比一下果然是是不一样。
知道原因就好解决了: 参考crontab中PATH的坑 大致知道了原因,也知道修改了:
30 8 * * * export PATH=/root/.nvm/versions/node/v10.13.0/bin:$PATH; rflogin >> /var/log/rflogin.log 2>&1
试用过 . /etc/profile
这种方式,还是没有生效,故直接手动加上环境变量。
网友评论