同じ処理が重複しないようにする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)
}
特定のファイルをロック確認に用いているので、複数の処理で用いる場合は被らせないよう注意が必要です。
コメント