如何在 golang 中创建一个 .lock 文件并在退出前将其删除?

How to create a .lock file in golang and remove it before exiting?

我试图阻止程序打开另一个已经打开的实例,为此我创建了一个扩展名为 .lock 的文件,并在退出程序时将其删除。然而,除了删除之外的一切都有效。

package main

import (
    "os"
    "os/signal"
    "fmt"
)

func main() {
    var test string
    exitsig := make(chan os.Signal, 1)
    signal.Notify(exitsig, os.Interrupt)
    var (
        lockstate bool = false
    )

    if _, err := os.Stat("ms.lock"); err == nil {
      return

    } else if os.IsNotExist(err) {
      var file, err = os.Create("ms.lock")
        if err != nil {
            return
        }
        file.Close()
        lockstate = true
    }

    go func() {
      <- exitsig
        fmt.Println("Error removing file")
        fmt.Scanf("%s", &test)
        if lockstate {
            var err = os.Remove("ms.lock")
            if err != nil {
                fmt.Println("Error removing file")
                fmt.Scanf("%s", &test)
            }
        }
      os.Exit(0)
    }()

}

我试过按ctrl+c退出,按window右上角的关闭按钮退出,但一直没有发出信号,os.Interrupt信号是从未被抓到。这是什么原因?

另外,我需要信号是非平台特定的,所以它应该在 windows 和基于 unix 的系统上都可以工作。

我想是因为你的main函数在启动goroutine后很快就存在了。如果 main 函数结束,所有 运行 个 goroutines 也会死亡。

这是适合我的代码:

package main

import (
    "fmt"
    "os"
    "os/signal"
    "sync"
)

func main() {

    exitsig := make(chan os.Signal, 1)
    signal.Notify(exitsig, os.Interrupt)
    var (
        lockstate bool = false
    )

    if _, err := os.Stat("ms.lock"); err == nil {
        return

    } else if os.IsNotExist(err) {
        var file, err = os.Create("ms.lock")
        if err != nil {
            return
        }
        file.Close()
        lockstate = true
    }

    go func() {
        <-exitsig
        if lockstate {
            var err = os.Remove("ms.lock")
            if err != nil {
                fmt.Println("Error removing file: ", err)
            }
        }
        os.Exit(0)
    }()

    wg := &sync.WaitGroup{}
    wg.Add(1)
    wg.Wait()

}

我添加了等待组在主线程中等待。在 MacOS 上工作正常 - 创建 ms.lock 文件并等待。用 Cmd + C 杀死它会删除文件。

只要信号触发,应该可以在任何地方工作。