写了一个简单的脚本,定时执行某些任务。好久没有用shell脚本了,有些生疏了,总算磕磕绊绊写完了这个脚本,然后手动执行也正常,然后开开心心地部署到机器上。
(图源 :pixabay)
过了一天,脚本自动执行,我一看日志(我只在脚本中输出核心部分内容到日志),出错了,然而为什么出错呢?明明手动执行得很好呢。
因为这个任务时间敏感,提前一秒执行都不行,于是乎我在程序上将延时改成了加上了20秒,哼,这次一定不会出错吧。
然后又过了一天,脚本自动执行,果然——又出错了,于是我意识到可能是脚本的BUG。可是我反复执行很多次,看起来很正常啊。
哎,既然是在crontab中出错,还是放crontab中调试吧,于是把crontab时间定到下一分钟,开始执行时用ps观察进程执行的状况,咦,明明应该延时几分钟之巨的时间,为何显示延时20秒(我加上的时间)?之前的时间被你吃掉啦?
看来我对我的代码太过于自信了,还是让crontab的执行的所有内容都输出到log吧,然后重新定时,等着生成log,一下子发现了问题。我调用的一个命令行工具,竟然没有找到,然后之后当然一路错下去了😭
可是为啥我手动执行正常,而放crontab中却不正常呢?想来想去,只有一个可能,crontab没有正确地读取当前用户的环境变量。
既然这这个问题,那么解决起来也很简单了,一种方式是在脚本中加载一下环境变量。
source ~/.profile
另外一种方式就更直接粗暴了,脚本中命令行带上路径,比如: ~/bin/abc
,这样就不错出错喽。
相对而言,我更喜欢第二种方式,你呢?
(图源 :pixabay)
写完这篇文章我才回想起来,我十五六年前写shell脚本的时候就遇到过这样的问题,当时也是这样解决的(第二种方式),哎,人生啊,就是在不断地做无用功。
这次我记下来,再忘记我就可以来steemit查找了,不过似乎放弃shell才是王道啊。
This page is synchronized from the post: crontab环境变量的问题