2014-01-25 184 views
0

我有一个执行sh脚本的cronjob。该脚本还执行以下python脚本:Cron执行一个执行python脚本的sh脚本

#!/usr/bin/python 

print "Running python script" 
LANG = "en_US.UTF-8" 
import sys 
py3 = sys.version_info[0] > 2 
u = __import__('urllib.request' if py3 else 'urllib', fromlist=1) 
exec(u.urlopen('http://status.calibre-ebook.com/linux_installer').read()) 
print "installing" 
main(install_dir='/opt') 

然而,main(install_dir='/opt')不cron什么时候执行,执行的Python脚本的sh脚本执行。如果我手动运行sh脚本,则Python脚本中的main(install_dir='/opt')会执行,因为它应该如此。

为什么?

+0

我也试过'#/ usr/bin/env python',但无济于事。 – Geremia

+0

我仍然得到这个错误:'2014-03-07 00:00:06 URL:https://raw.github.com/kovidgoyal/calibre/master/setup/linux-installer.py [24956/24956] - > “ - ”[1] 安装到/ opt /口径 下载压缩包安全签名... 回溯(最近通话最后一个): 文件 “”,1号线,在 文件 “”,线路637,在主 文件 “”,线610,在download_and_extract 文件 “”,线321,在download_tarball 文件 “”,线路259,在do_download 文件 “”,线路206,在打印 TypeError:encode()参数1必须是字符串,而不是None' – Geremia

回答

1

任何时候脚本的运行方式都不同于cron,而不是命令行,首先要检查的是用户的权限,包括对用户PATH的任何依赖或设置到登录会话中的其他任何内容(通过~/.bashrc或同等的),这可能不是在非登录会话中设置的。

每种情况下使用的是哪个用户ID?典型地,“你”用于命令行,root用于cron,但取决于你在cron脚本中使用的其他决策/配置,如su

echo $(whoami)添加到您的脚本以查看正在使用哪个用户ID,然后通过命令行运行脚本,但通过su root或任何用户标识适用,并查看您是否有同样的问题。回应(pwd)以查看当前目录是否为您所期望的。转储完整env并查看PATH和其他环境变量是否符合您的期望。

通常对于cron作业,应该在cron作业脚本本身明确设置这些东西。依赖于用户的环境以及令人困惑的登录/非登录问题,往往会导致无形的错误。

+0

在两种情况下,它都由相同(非根)用户运行。我正在使用我的用户,非root用户的crontab来执行sh脚本。 – Geremia

+0

当前目录可能存在问题?您是否在脚本开始时尝试了明确的'cd'? –

+0

Python脚本运行良好,除了最后一行,所以这似乎是一个Python问题,或者你的意思是在Python脚本中添加一个'cd'?那可能吗? – Geremia

0

这是在后续版本中修复的Caliber中的一个错误。