go - 如何阻止重复进程?
问题描述
我一直在研究一种解决方法,以便如果启动了一个容器,同时启动了一个重复的容器,那么在第一个容器成功退出之前,它不应该继续运行而是阻塞。为了实现这一点,我使用了flock,但这肯定对我没有帮助,它有时会起作用,即一个容器获取flock,而另一个容器被阻塞,但有时同时获取flock并继续运行。我的用例是其他容器应该等到其他容器成功退出。这是我正在使用的代码:
// Flock locks the jiva.lock file. If the file does not exist, it is
// created. If a new process is trying to access the same file it will
// return an error "resource temporarily unavailable".
func Flock(dir string) error {
logrus.Info("Take flock on jiva.lock file")
file, err := os.OpenFile(dir+"/jiva.lock", os.O_CREATE|os.O_RDWR, 0644)
if err != nil {
return err
}
// golang.org/x/sys/unix
err = unix.Flock(int(file.Fd()), unix.LOCK_EX|unix.LOCK_NB)
if err != nil {
file.Close()
return fmt.Errorf("Failed to flock, error: %v", err)
}
logrus.Infof("flock successful on file: %v", file.Name())
return nil
}
我正在使用绑定挂载,以便文件jiva.lock
在两个容器中共享。即使我在这两种情况下大部分时间都直接在我的系统和 docker 容器中运行二进制文件,这也不起作用。我也尝试使用 strace 对其进行调试,但它也表明两者都已成功获取群。任何帮助将不胜感激。
解决方案
推荐阅读
- angular - 角度 2+ canDeactivate async:false
- mongodb - 如何从 mongodb/pymongo 获取不同的键
- python - 如何使用 SquareSpace 登录 Python 程序
- javascript - Firestore (web) 添加简单集合
- wso2 - 如何为 wso2 身份服务器权利创建策略
- apache - 使用 Apache 列出目录内容
- c - 发送带有 XML 内容的 POST http 请求
- javascript - 电子无法收到通知
- wordpress - 如何在wordpress帖子中显示html结果视图
- angular - ngrx 实体应该存储在功能级别还是应用级别?