在服务器上方便的跑一次性golang脚本

场景描述

有一个跑的时间非常长的任务,大概需要连续跑20h,这个任务是一次性的,不值得去配置什么CICD

思路

golang手熟所以使用golang去完成了,曾经思考是不是用其他脚本语言会更好?
但是对于这种一次性的需求,显然哪个语言熟练度高就用哪个语言了。
最好的方式应该是使用交叉编译,打包一个可执行文件,扔到服务器上去运行即可。
或者也可以在一个有运行环境的服务器上。

最后手头有一个没有golang环境,但是有docker环境的,不清楚linux版本的测试机器。决定使用docker的方式来运行这个脚本。

配置

  • 任何ssh工具(我是用mobaXterm)
  • 一台具有docker环境的机器

具体过程

登录到运行机器上,先通过ssh工具把代码传到机器上。
然后cd到代码所在的文件夹,直接运行以下语句:

1
docker run -it --rm -v $(pwd):/app -w /app golang:1.20 bash

你将获得一个一次性的,以当前目录挂载到app文件夹下的golang容器,需要注意的是,因为用了rm的选项,一旦退出当前ssh会话,容器就被销毁了。

如果需要一个真正的,后台一直运行的任务,需要用如下命令

1
docker run -d --rm -v $(pwd):/app -w /app golang:1.20 bash -c 'while true; do echo "The script is running at: $(date)"; sleep 1; done'

其中单引号里的语句替换成真正的生产实际语句。

golang的google源没办法使用,记得先换成使用命令换成国内源

1
export GOPROXY=https://goproxy.cn,direct

最后的命令应该组成类似于

1
docker run -d --rm -v $(pwd):/app -w /app golang:1.20 bash -c 'export GOPROXY=https://goproxy.cn,direct;go run main.go'

附上一段我自己用的main.go测试文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main

import (
"fmt"
"time"
)

func main() {
for {
// 获取当前时间
currentTime := time.Now().Format(time.RFC3339)
// 打印当前时间
fmt.Printf("The script is running at: %s\n", currentTime)
// 等待 1 秒
time.Sleep(1 * time.Second)
}
}