为了防止应用被重复打开,如何实现?有没有现有的框架或者库?
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
其实解决这个办法就算不用框架也可以做到, 只是稍微消耗一点性能. 最简单的办法就是创建一个文件作为flag
不知道这个库有没有这个功能 https://github.com/kardianos/service
可以监听一个端口,如果失败直接退出。
pid文件?
应用到系统已经是系统进程了,可以根据查找进程名字判断。但楼上说的监听一个端口是简单实用的好办法。
异常崩溃了呢,单纯一个flag应该也不能判断是不是真的有进程存在吧。
#1楼 @focusonline 异常崩溃了呢,单纯一个flag应该也不能判断是不是真的有进程存在吧。
生成一个文件应该不会崩溃的啊? 是的, 还需要一些技巧, 比如一个时间的阈值.需要不停的touch这个文件刷新时间点等等 而且如果两个几乎同时启动的,可能还是没有用,这毕竟不是操作系统提供的同步方式.
看一下这篇文章 https://blog.csdn.net/weiyuefei/article/details/77892871 os包里面有进程的函数可用.应该能解决你的问题了, 楼上已经提到了这个. 监听端口也可以,但是这个要浪费一个端口资源, 还是用查找进程的办法吧.
package prepare import "syscall" const ( lf = "singleton.lock" ) func singleton() { if fd, err := syscall.Open(lf, syscall.O_CREAT|syscall.O_RDONLY, 0644); err != nil { panic(err) } else if err := syscall.Flock(fd, syscall.LOCK_EX|syscall.LOCK_NB); err != nil { panic(err) } return }
共享内存 有名管道 socket等等
```go package prepare import "syscall" const ( lf = "singleton.lock" ) func singleton() { if fd, err := syscall.Open(lf, syscall.O_CREAT|syscall.O_RDONLY, 0644); err != nil { panic(err) } else if err := syscall.Flock(fd, syscall.LOCK_EX|syscall.LOCK_NB); err != nil { panic(err) } return } ```
get了 谢谢。
`单行代码`
其实解决这个办法就算不用框架也可以做到, 只是稍微消耗一点性能. 最简单的办法就是创建一个文件作为flag
不知道这个库有没有这个功能 https://github.com/kardianos/service
可以监听一个端口,如果失败直接退出。
pid文件?
应用到系统已经是系统进程了,可以根据查找进程名字判断。但楼上说的监听一个端口是简单实用的好办法。
异常崩溃了呢,单纯一个flag应该也不能判断是不是真的有进程存在吧。
生成一个文件应该不会崩溃的啊? 是的, 还需要一些技巧, 比如一个时间的阈值.需要不停的touch这个文件刷新时间点等等 而且如果两个几乎同时启动的,可能还是没有用,这毕竟不是操作系统提供的同步方式.
看一下这篇文章 https://blog.csdn.net/weiyuefei/article/details/77892871 os包里面有进程的函数可用.应该能解决你的问题了, 楼上已经提到了这个. 监听端口也可以,但是这个要浪费一个端口资源, 还是用查找进程的办法吧.
共享内存 有名管道 socket等等
get了 谢谢。