【问题标题】:Cron executing a sh script that executes a python scriptcron 执行一个执行 python 脚本的 sh 脚本
【发布时间】:2016-01-28 22:43:02
【问题描述】:

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

#!/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') 会执行,因为它应该执行。

为什么?

【问题讨论】:

  • 我也试过#!/usr/bin/env python,但无济于事。
  • 我仍然收到此错误:2014-03-07 00:00:06 URL:https://raw.github.com/kovidgoyal/calibre/master/setup/linux-installer.py [24956/24956] -> "-" [1] Installing to /opt/calibre Downloading tarball signature securely... Traceback (most recent call last): File "<string>", line 1, in <module> File "<string>", line 637, in main File "<string>", line 610, in download_and_extract File "<string>", line 321, in download_tarball File "<string>", line 259, in do_download File "<string>", line 206, in prints TypeError: encode() argument 1 must be string, not None

标签: python shell python-2.7 cron sh


【解决方案1】:

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

每种情况下使用的用户 ID 是什么?通常“你”用于命令行,root 用于 cron,但这取决于您在 cron 脚本中使用的其他决策/配置,例如 su

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

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

【讨论】:

  • 在这两种情况下都由同一个(非 root)用户运行。我正在使用我的用户,非 root crontab 来执行 sh 脚本。
  • 当前目录可能有问题?您是否在脚本开头尝试过明确的cd
  • Python脚本运行良好,除了最后一行,所以这似乎是Python的问题,还是您的意思是在Python脚本中添加cd?这可能吗?
  • 另外,从根 crontab 运行它时,我遇到了同样的问题。
  • 您可以通过添加import os 然后添加print os.getcwd() 来检查当前目录是否是您认为的那样。如果目录需要更改,则使用os.chdir(fullpath)进行设置。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-27
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多