虽然称之为“坑”,但是主要还是我自己对立面的道道不太了解所致。
背景介绍:
首先有一个python脚本,这个python首先会执行一些linux的命令,比如解压文件、复制文件等等,完成之后会通过java -jar的方式调用某一个jar包做一些操作。
原文来源:http://www.flyml.net/2016/11/30/crontab-java-not-found/
问题表现:
每次手动执行这个python脚本运行,程序工作的很好,但是如果是通过crontab的方式来运行,就会发现程序只执行了,但是java应该做的事情完全没做。
在crontab命令增加了 2>&1的后缀之后,终于看到了错误信息:
sh: l: java not found
原文来源:http://www.flyml.net/2016/11/30/crontab-java-not-found/
问题原因:
经过各种google之后,才发现,当我们手动ssh进去的时候,会加载~/.bashrc 以及 /etc/profile等等环境变量配置文件。但是crontab缺不会做这个事情,是由系统调用起一个最小的环境来做这些操作(具体原因不明)。即: crontab不会加载环境变量配置文件
当找到了问题的原因之后,解决方案就很明了: 强制加载环境变量的配置文件
原文来源:http://www.flyml.net/2016/11/30/crontab-java-not-found/
解决方案 – 1 :增强型crontab
(亲测发现不行,可能是我水平有问题)
在crontab的命令里面增加source /path/to/configfile. 比如我们的java是配置到/etc/profile之中,那么我的crontab命令就是:
* * * * source /etc/profile; cd XXXX && pythontask.py >> ~/debug.log 2>&1
但是发现这种方式在我的环境并没起作用
解决方案 – 2 : bash脚本出马
这种方式需要在增加一个bash脚本来调用python命令。参考下面:
#!/bin/bash source /etc/profile pythontask.py
注意:第一行一定不能省略啊!
原文来源:http://www.flyml.net/2016/11/30/crontab-java-not-found/
补充说明: command >> file 2>&1 是什么?
这也是今天在尝试让crontab打印出错误信息才学到的东西。
先说说下面的命令的意思:
command >> file 2>>file
这是说:正常的输出信息会添加到file之中,错误信息也会添加到file之中,但是是两个文件管道FD1跟FD2同时在抢,并且可能产生互相覆盖的现象
command >> file 2>&1
就不太一样了:首先正常的输出(到屏幕)信息会通过管道FD1会添加到file之中,错误信息会继承FD1也添加到file 之中。
当crontab命令加上这个后缀(2>&1) 之后,我的debug.log 之中终于出现如下图所示的错误信息(sh: l: java not found),也终于找到了解决问题的方向。
本文为原创文章,转载请注明 出处
原文链接:http://www.flyml.net/2016/11/30/crontab-java-not-found/