【问题标题】:Crontab won't run go / golang programcrontab 不会运行 go/golang 程序
【发布时间】:2016-02-29 07:41:44
【问题描述】:

我已设置 crontab 来运行已编译的 golang 脚本。该脚本负责将文件夹复制到 ftp。这没什么特别的。

只需键入“/backup/main”,我就可以在命令行中运行该程序,而且一切正常。

现在我想每晚运行这个程序。我已将 cronjob 设置为每 5 分钟运行一次以测试它是否有效。它没有!

如果我检查系统日志,我可以看到程序正在被调用,但没有任何反应。

文件“/backup/main”是chmod a+x crontab 在“sudo”中设置(sudo crontab -e)。所以所有权限应该没问题。

crontab 中的那一行:

*/5 * * * * /backup/main

希望有人可以提供帮助。

【问题讨论】:

    标签: linux go cron crontab


    【解决方案1】:

    希望能帮助像我一样找不到解决方案的其他人:

    可以通过将 path 和 gopath 变量添加到 crontab -e 文件来解决此问题。

    你可以通过运行echo $PATHecho $GOPATH找到它们

    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/go/bin:/root/bin
    GOPATH=/var/projects/src
    
    # +---------------- minute (0 - 59)
    # |  +------------- hour (0 - 23)
    # |  |  +---------- day of month (1 - 31)
    # |  |  |  +------- month (1 - 12)
    # |  |  |  |  +---- day of week (0 - 6) (Sunday=0)
    # |  |  |  |  |
      */5 * * * * /backup/main
    

    您的代码可能由于 go 无法找到包的错误而无法运行

    即您通过运行go get 示例安装的第三个软件包

    go get gopkg.in/gomail.v2
    

    问题是您的工作目录中可能有go get! 在我的情况下是GOPATH=/var/projects/src

    你可以看到里面的包

    /your/working_directory/src/pkg/linux_amd64

    【讨论】:

    • 谢谢,加维特!就我而言,添加 GOPATH=/path/to/my/project/ 就足够了
    【解决方案2】:

    关于 cron 静默失败的传统看法是,它可能是环境问题。通过将您的 golang 程序包装在一个 shell 脚本中,您可以控制环境(并让您的配置文件运行)。您还可以放入有用的调试位,例如“env”。

    用它的空环境运行模拟 cron:

    env -i ./myscript.sh
    

    myscript.sh 是 chmod +x 并且只运行“env”。然后把你的 golang 命令放在那里,看看它在没有环境的情况下是否仍然有效。然后当你证明它是环境时(希望如此),在 cron 中使用 shell 脚本。

    【讨论】:

    • 环境只是告诉我以下“没有这样的文件或目录”。所以似乎环境找不到文件夹/文件。有什么办法解决这个问题吗?
    • 嗯。您要运行哪个文件?粘贴完整路径以及文件上的 ls -l。
    【解决方案3】:

    可能有问题,程序打印了一些日志,但是日志会被重定向到/dev/null,你无法查看错误日志。 您可以添加它以将日志打印到某个日志文件。

    */5 * * * * /backup/main 1>> /path/to/log/file 2>>/path/to/error_log/file
    

    【讨论】:

    • 日志级别 2 告诉我找不到文件。我现在已经检查了十次。路径正确。
    • 我的程序出错了。它正在寻找错误的目录。通过您提供的日志行进行的调试有助于发现此问题。
    【解决方案4】:

    我偶然发现了这篇文章,因为这正是我遇到的问题。 crontab 没有运行我编译的 golang 二进制文件。 对我来说,问题是 crontab 行的配置不正确。 我在配置中遵循以下格式,这对我有用:

    * * * * * cd folder_containing_exe && ./exe_name
    

    注意!这会每分钟运行一次二进制文件
    来源:How to set up a cron job to run an executable every hour?
    希望这可能对遇到类似问题的人有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 2016-09-04
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      相关资源
      最近更新 更多