如何阻止重复进程?

时间:2018-12-18 11:56:11

标签: go

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

0 个答案:

没有答案