首页 > 解决方案 > 如何阻止重复进程?

问题描述

我一直在研究一种解决方法,以便如果启动了一个容器,同时启动了一个重复的容器,那么在第一个容器成功退出之前,它不应该继续运行而是阻塞。为了实现这一点,我使用了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 对其进行调试,但它也表明两者都已成功获取群。任何帮助将不胜感激。

标签: go

解决方案


推荐阅读