如何同时只运行一个实例?

有些情况,程序无论启动多少次,只允许运行一个实例。

要求:

  1. 程序无论启动多少次,只允许运行一个实例
  2. 每次启动时,都会传递一个参数,运行的实例会依次处理这些参数。
    例如,运行了一次
    $myprog -arg=v1
    
    又运行了几次
    $myprog -arg=v2
    $myprog -arg=v3
    ... ...
    
    myprog 依次处理v1、v2、v3这几个参数。
    请问有思路吗?

共 10 个回复


CrossRun

就我所知道的:
1.windows下有相应的标志位处理。其他OS不知道。
2.可以运行的时候判断下有没有已运行的存在,存在就结束自己。

# 0

Zhangyc310

但怎么把第二次运行的参数v2传递给正在运行的实例呢?

# 1

stevewang

一个不限于特定OS的通用方法:
1.启动一个TCP监听端口,第二个实例监听失败就知道已经有其他实例了。
2.第二个实例监听失败以后就连接这个监听端口,把参数通过TCP连接发送给第一个实例,之后退出;第一个实例接受到参数以后做相应处理。

# 2

Zhangyc310

@stevewang
如果这样的话,不如干脆分为两个进程,一个监听进程,负责接收参数并处理;另一个每次启动发送参数后退出。

# 3

stevewang

@#4
当然可以分为两个进程,其实这样更好。

# 4

Zhangyc310

@stevewang
如果分为两个进程,负责启动发送参数后退出的这部分,性能如何?
Go程序每次启动再退出,与C程序相比,耗费的时间多吗?

# 5

stevewang

看你发送参数的频率了。
如果一秒钟几十上百次,还是保持长连接比较好。
如果几分钟一次,用启动-发送参数-退出这样的短连接模式就不会影响性能。
还有就是看那种方式更容易操作。

# 6

kzzhr

其实这是个进程间通信的问题,Go提供的rpc库很方便,可以看看。虽然有点大材小用。

# 8

holmeszyx

一般都是 互斥或者文件锁。
看目标操作系统选择。
windows 应该是用互斥
linux 多是文件锁

# 9