转载

记录一个crontab的“坑”

虽然称之为“坑”,但是主要还是我自己对立面的道道不太了解所致。

背景介绍:

首先有一个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),也终于找到了解决问题的方向。

记录一个crontab的“坑”

本文为原创文章,转载请注明 出处

原文链接:http://www.flyml.net/2016/11/30/crontab-java-not-found/

原文  http://www.flyml.net/2016/11/30/crontab-java-not-found/
正文到此结束
Loading...