[Golang] batch処理で同じ処理が重複起動しないようにする

golang Golang

同じ処理が重複しないようにするTips

Go言語で「処理が落ちたら再起動してほしいけど、前のプロセスが生きている間は何もせず終了してほしいな」ということ、あるのではないでしょうか。簡易的な自動立ち上げをcrontabなどでする場合、いかのようなプロセス確認utilityを用意するのが便利です。

実装

package util

import (
    "fmt"
    "os"

    "github.com/gofrs/flock"
)

func CheckLock(lockFile string, onExist func(), onNotExist func()) {
    fileLock := flock.New(lockFile)

    locked, err := fileLock.TryLock()
    if err != nil {
        fmt.Println("Failed to acquire lock:", err)
        os.Exit(1)
    }

    if !locked {
        onExist()
    } else {
        defer fileLock.Unlock()
        onNotExist()
    }
}

mainからの呼び出し

これでmainから以下のように呼び出します

func main() {
    lockFile := "/tmp/my_process.lock"

    onExist := func() {
        fmt.Println("Another instance is already running.")
        os.Exit(0)
    }

    onNotExist := func() {
        for {
            fmt.Println("hello, world")
            time.Sleep(5 * time.Minute)
        }
    }

    CheckLock(lockFile, onExist, onNotExist)
}

特定のファイルをロック確認に用いているので、複数の処理で用いる場合は被らせないよう注意が必要です。

コメント

タイトルとURLをコピーしました