这种需求很常见,最常使用的技术就是互斥锁。
例如某个服务运行后,生成一个 PID 文件,里面写入当前运行的进程 PID,运行结束后主动删除这个文件。当有其他进程运行时,先检查这个文件及对应的进程是否存在,存在就是正在运行,否则就可以运行。
现成的例子可以参考 Linux 系统的 /run 目录下的 *.pid 文件。
Windows 系统也是一样,存放在固定的路径就行。
这里有几个注意点:
PID 锁文件的路径最好是绝对路径,如 Linux 下的 /run/service.pid,Windows 的系统盘下面,一般可以写在配置文件里(配置文件有默认的,也可以指定)。如果只是当前目录下的相对文件,如果不小心复制到另一个目录就没用了。
PID 锁文件一般的做法是只写入进程 PID 号,因为程序可能由于意外或者被 kill 等原因被关闭,这样可能就无法主动删除锁文件。所以如果锁文件存在,还要判断下对应的进程是不是存活,不然要手动删除锁文件,这样程序比较健壮。
复杂的场景下需要考虑多用户权限问题,例如锁文件权限,服务执行用户等等,一般是比较成熟后会考虑,如果 Windows 完全是管理员操作可以忽略。
更健壮的程序还需要考虑并发抢占锁的问题。