有些程序我们希望在一台机器上只有一个实例在运行,我在windows下也遇到过很多类似这样的程序,如QQ,它只允许同时运行一个。那么我们在Linux该如何实现这样的单例运行的程序呢?
思路
实现这样的程序方法很多,但是总体思路都是类似的:
-
1.启动程序,检测标志,判断是否有同样的程序运行,是则2,否则3
-
2.程序退出
-
3.程序启动,并设置标志,以便下次启动时检测
实现方法
按照这种思路,实现的方法有很多种,例如使用ps等命令获取该进程的进程数,大于0 表示已有运行;启动后写一个临时文件,如果下次启动时发现有该文件,则直接退出;创建一个文件并加锁,退出时删除文件,新的程序启动时试图加锁,如果失败,则说明已有实例运行……
除了上面说到的这些,可能还有一些其他的实际做法,但是本文介绍一种实用并且也是非常通用的做法,即文件锁的方法。
基本原理
程序在启动后,打开一个program.pid文件(无则创建),然后试图去设置文件锁(如果还不理解锁的概念,可以简单理解为,一旦a写锁定了,b就无法进一步写操作了,除非a释放锁),如果设置成功,就将该程序的进程ID写入该文件;如果加锁失败,那么说明已经有另外一个实例在运行了,则退出此次启动。而当前已经运行的程序如果退出了,该文件会自动解除锁定。
实际上,我们观察一下/var/run/目录下,有很多类似这样的文件:
$ ls -l /var/run/*.pid
-rw-r--r-- 1 root root 5 11月 24 08:19 /var/run/acpid.pid
-rw-r--r-- 1 root root 5 11月 24 08:19 /var/run/atd.pid
-rw-r--r-- 1 root root 5 11月 24 08:19 /var/run/crond.pid
-rw-r--r-- 1 root root 5 11月 24