如何使用crontab执行Golang二进制文件

如何使用crontab执行Golang二进制文件 0

我已经从一个Go脚本创建了一个二进制文件,现在需要用crontab来运行它。在命令行中手动执行这个二进制文件没有问题。我使用的是WSL中的Ubuntu。 Crontab保存成功,但脚本似乎没有执行。

Cronjob看起来像这样:

*/1 01 * * * /home/tgr/test-bin/main/main -download > /dev/null 2>&1
  • 我是在凌晨1点测试的,所以crontab的小时字段是01。

运行带有“-download”标志的脚本,会尝试使用一个YAML配置文件从存储桶下载一些文件,然后执行一些次要任务,如解压缩、复制和验证文件结构。它也会生成一个日志文件。

我已经用以下命令启动了cron服务:

sudo service cron start

您能提供一些建议吗?


更多关于如何使用crontab执行Golang二进制文件的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

你好,Christophe,非常感谢你的回答。

是的,我希望脚本每分钟执行一次,只是为了能快速看到日志文件中的变化。

我用另一个简单的Go二进制文件测试了crontab,它只向标准输出打印“Hello”,并将其重定向到一个文本文件,结果符合预期。

更多关于如何使用crontab执行Golang二进制文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


首先,我会通过使用一个更简单的命令来测试crontab是否正常工作。可以是一个输出"hello world"的bash脚本,并去掉所有这些重定向。

同时,使用一个更简单的周期设定。*/1 表示每分钟运行一次命令。这是你想要的吗?我不确定 01 是否有效。为了保险起见,我会把它替换成 1

好的。那么这很可能是你的二进制文件有问题。尝试移除重定向到 /dev/null 的操作,这样任何输出都会打印到标准输出,并通过邮件发送给 postmaster。为了测试,没有必要每分钟都运行它,因为如果有输出,你会收到大量邮件。

顺便说一下,你提到你从一个 go 脚本制作了一个 go 二进制文件。通常没有所谓的 go 脚本。只有 Go 代码,必须经过编译才能成为可以运行的二进制文件。

在crontab中执行Golang二进制文件时,常见问题包括环境变量、路径和权限问题。以下是解决方案:

  1. 使用绝对路径:确保二进制文件和配置文件的路径都是绝对路径
*/1 01 * * * /home/tgr/test-bin/main/main -download -config /home/tgr/test-bin/config.yaml > /home/tgr/test-bin/cron.log 2>&1
  1. 设置环境变量:在crontab开头添加必要的环境变量
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/home/tgr/go/bin

*/1 01 * * * /home/tgr/test-bin/main/main -download > /home/tgr/test-bin/cron.log 2>&1
  1. 检查二进制文件权限
chmod +x /home/tgr/test-bin/main/main
  1. 调试方法:将输出重定向到日志文件以便调试
*/1 01 * * * /home/tgr/test-bin/main/main -download >> /home/tgr/test-bin/debug.log 2>&1
  1. 在Go代码中添加环境检查
package main

import (
    "fmt"
    "log"
    "os"
    "path/filepath"
)

func main() {
    // 记录当前工作目录
    wd, _ := os.Getwd()
    log.Printf("Current working directory: %s", wd)
    
    // 记录环境变量
    log.Printf("PATH: %s", os.Getenv("PATH"))
    
    // 使用绝对路径访问配置文件
    configPath := filepath.Join("/home/tgr/test-bin", "config.yaml")
    if _, err := os.Stat(configPath); err != nil {
        log.Fatalf("Config file not found: %v", err)
    }
    
    // 你的业务逻辑...
}
  1. 验证cron服务状态
sudo service cron status
ps aux | grep cron
  1. 查看cron日志(Ubuntu):
sudo grep CRON /var/log/syslog
  1. 完整crontab示例
# 设置环境
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/home/tgr

# 你的任务
*/1 01 * * * cd /home/tgr/test-bin && ./main/main -download >> /home/tgr/test-bin/cron.log 2>&1

关键点:确保二进制文件有执行权限,使用绝对路径,设置正确的环境变量,并将输出重定向到日志文件以便调试。

回到顶部