检查另一个程序实例是否已在运行

时间:2014-07-30 23:07:11

标签: c++ unix freebsd

如何检查已在UNIX系统下运行的另一个程序实例? exit()如果是这样的话。

当流程开始时,我已经在file上使用了pid。然后我检查pid它是否存在。但是不时的程序运行时出现意外行为,并且我有大量的程序副本正在运行。

3 个答案:

答案 0 :(得分:1)

使用适当的同步机制(例如process shared semaphore),以防止两次启动程序。

答案 1 :(得分:1)

如果要将pid写入文件,则应使用flock序列化对该文件的访问。

答案 2 :(得分:0)

在两个致命的场景中解决方案工作。

1>甚至你的已启动的exe在任务管理器中被安排为javaw.exe。

2 - ;您可以在两个位置安装您的应用程序,从启动这两个位置它也可以。

String tempDir = System.getProperty("java.io.tmpdir");// dependent to OS find any tem dir.
String filePath = tempDir + "lockReserverd.txt";
try {
    final File file = new File(filePath);

    if(file.exists())
        return false;

    final RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
    final FileLock fileLock = randomAccessFile.getChannel().tryLock();
    if (fileLock != null) {
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                try {
                    fileLock.release();
                    randomAccessFile.close();
                    file.delete();
                } catch (Exception e) {
                    //log.error("Unable to remove lock file: " + lockFile, e);
                }
            }
        });
        return true;
    }
} catch (Exception e) {
    //log.Error("Unable to create and/or lock file");
}
return false;