Golang Go语言中如何判断自身已被执行?

发布于 1周前 作者 bupafengyu 来自 Go语言

网上暂时找到两个方法:

  1. 进程运行时检查当前目录下有没有 PID 文件,有就是重复执行。没有的话就获取当前 PID 保存在当前目录。
  2. os.Getenv 获取环境变量,为空就是首次执行,然后写入环境变量。不为空就是重复执行。

第一种方式问题是需要文件锁,而 win 不支持文件锁。 第二种不知道 win 是否支持,但是如果进程启动后被 kill 掉,那么环境变量依然存在,还会被视为重复运行。

我想实现如果首次执行就后台运行,开始监听端口,等待被调用业务函数。 如果已经执行,就显示菜单,等待输入业务指令。

请教大佬还有哪些办法可以判断自身已经被执行?

hash 自身程序?然后在进程里对比?是不是太极端了?进程里找程序名会不会太不严谨?求教!


Golang Go语言中如何判断自身已被执行?

更多关于Golang Go语言中如何判断自身已被执行?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

22 回复

更多关于Golang Go语言中如何判断自身已被执行?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


绑定一个端口

如果有配置文件,那么可以把 PID 位置在配置文件里指定,端口也可以在配置文件里指定。

如果端口或者 PID 存在,并且端口上能够正确应答,那就可以认为是已经在运行了。

喊它一声,看它敢不敢答应

获取自身进程路径然后找找系统进程有没有里有没有相同路径

windows 有一个机制好像会生成一个唯一的 GUID 然后可以保证单例运行。

https://www.c-sharpcorner.com/UploadFile/f9f215/how-to-restrict-the-application-to-just-one-instance/

一看看过 C++的相关东西, 有一次无意听到我 CTO 说过 常用的有检查文件,每次成功启动在指定目录写一个文件; 还一种方式就是监听端口, 但是我想了一下 这个不能使用 端口复用这个特性

windows 下可以通过 CreateMutex 创建互斥量来做进程间的互斥访问。所以可以条件编译,windows 下用 windows 的方式,linux 下用 linux 的方式。

另外,既然你需要在执行后监听端口,那么如果没有开启 SO_REUSEPORT 的话,应该第二个进程在尝试监听同一个端口的时候就会失败,捕获这个 error 不就可以实现互斥了吗?

CreateMutexW, 具体代码就不贴了, 自己看一些网游 ,还有一些不准多开的软件, 还有比如微信, 你用 process hacker 把它的 mutex 关了就可以多开了

单例是吧?写个文件,检查进程号啥的都行。

或者用系统接口,https://www.csdn.net/tags/MtTaAg2sNTcyODQ2LWJsb2cO0O0O.html

绑定到一个固定的端口,第二个服务就起不来了

哈哈哈,人才

有配置文件,正在按你说的尝试,应该可以


简明扼要通俗易懂!


不严谨,如果是不同路径的相同程序呢


谢谢我瞅瞅先


检查端口会有两种可能,一种是已运行,另一种是端口被其他程序占用了


监听的端口不固定,而且允许用户自定义监听端口,所以不能作为唯一判断。


mark 一下,稍后学习



感谢

每次启动尝试一下删除文件,删除成功就创建一个新的文件并且 hold 住,然后启动实例

设置进程名

github.com/gofrs/flock
用的这个文件锁,有 win 实现

启 udp…然后做好应答。
另一个启的时候,广播含一嗓子,有正确应答就是已经启动了

狗头保命

一般是用文件锁

在Golang(Go语言)中,直接判断一个特定的goroutine(Go语言的并发执行单元)或函数是否已经被执行是比较复杂的,因为Go语言并没有提供内置的、直接的方式来追踪这一点。不过,你可以通过一些编程技巧来间接实现这一需求。

一种常见的方法是使用同步原语(如channel、mutex、atomic变量等)来记录状态。例如,你可以使用一个布尔类型的变量来标记某个函数或代码块是否已被执行,并使用互斥锁(mutex)来确保对该变量的访问是线程安全的。

以下是一个简单的示例,使用互斥锁和一个布尔变量来判断某个函数是否已被执行:

package main

import (
    "fmt"
    "sync"
)

var (
    executed bool
    mutex    sync.Mutex
)

func checkAndExecute() {
    mutex.Lock()
    defer mutex.Unlock()
    if !executed {
        executed = true
        fmt.("PrintlnFunction executed for the first time.")
    } else {
        fmt.Println("Function has already been executed.")
    }
}

func main() {
    checkAndExecute()
    checkAndExecute()
}

在这个示例中,checkAndExecute函数会检查executed变量的值,并在首次执行时将其设置为true。之后的调用会检测到该变量已被设置,并输出相应的消息。

请注意,这种方法适用于单实例应用程序。在分布式系统或多实例环境中,你可能需要采用更复杂的分布式锁机制来实现类似的功能。

回到顶部