【问题标题】:Python script doesn't execute bash commands in cron jobPython 脚本不会在 cron 作业中执行 bash 命令
【发布时间】:2018-05-20 05:23:46
【问题描述】:

我已经编写了 Python 脚本,我想每天在我的服务器(Cent OS)上执行它。我需要直接从我的 Python 脚本执行一些 bash 命令。当我直接从终端运行脚本时一切正常,但是当 cron 作业执行脚本时不会执行 bash 命令,尽管脚本的其余部分是作业(插入数据库等)。

我的 crontab 如下所示:

00 20 * * 1-5 /home/skanydok/script.sh

script.sh 包含

#!/bin/bash

python /home/skanydok/serverBarcodeScanner.py

我有几种方法用于从服务器移动、复制或删除文件,示例方法如下所示:

def copyBackup():
cmd = "cp -r SKANY_DOKUMENTOW_" + str(now)[:10] + '_' + str(random) + " ./backupy"
call(cmd.split(" "))

我还使用此代码将方法 print 的所有输出保存到日志文件:

class Logger(object):  
def __init__(self):
    self.terminal = sys.stdout
    self.log = open("./backupy/log.txt", "a")

def write(self, message):
    self.terminal.write(message)
    self.log.write(message)


sys.stdout = Logger()

未创建 log.txt 文件,所有应该执行命令(如 cp、mv、rm 等)的方法都不起作用,尽管在服务器上执行脚本时它们可以正常工作:

python /home/skanydok/serverBarcodeScanner.py

我认为 cron 作业肯定有问题,非常感谢所有帮助。

【问题讨论】:

  • 你试过使用python的绝对路径吗?例如/usr/bin/python /home/skanydok ...
  • 如上面提到的@Farhan.K,尝试使用python 的绝对路径或加载用户的bash 配置文件而不是#!/bin/bash,如. ~/.bash_profile。另外,当我们在脚本中引用路径时不要忘记使用绝对路径,或者确保在内部使用 cdpwd 检查以确保脚本在所需的路径中运行。

标签: python linux bash shell cron


【解决方案1】:

这是 cronjobs 的问题本身,但事实上您的脚本使用相对路径。相对路径是针对“当前工作目录”解析的,当您从主目录手动运行脚本和由 cron 运行脚本时,这并不相同。显然,解决方案是在脚本中只使用绝对路径。如果它们不应该改变(这里似乎就是这种情况),你可以在 python 脚本本身中对它们进行编码,或者在你的 python 脚本中使用os.path.dirname(os.path.abspath(__file__)) 来获取脚本的目录路径。

【讨论】:

    猜你喜欢
    • 2011-01-24
    • 2015-05-19
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2017-11-16
    • 2014-05-23
    相关资源
    最近更新 更多