ゲンゾウ用ポストイット

Java、Groovy、Linux関連の備忘録

アプリケーションの二重起動を禁止する。

Groovyに限ったことではないが、アプリケーションの二重起動を防止する方法をメモ。

以下のように、ファイルチャネルからロック取得が成功するかどうかで二重起動を防止できる。

Attach API( Oracle Technology Network for Java Developers )というのを利用しても実現できるらしいが、IcedTea、Linuxjdkのいずれにも標準装備されていないようなので断念した。(ClassNotFountExceptionが発生)

#!/usr/bin/env groovy
import java.nio.channels.*

class Lock { 
    public static boolean getLock() {
        final FileOutputStream fos = new FileOutputStream(new File("lock"))
        final FileChannel fc = fos.channel
        final FileLock lock = fc.tryLock()

        if (lock == null) {
            return false
        }

        Runtime.runtime.addShutdownHook {
            if (lock != null && lock.valid) {
                lock.release()
            }
            fc.close()
            fos.close()
        } as Thread

        return true
    }
}

if( !Lock.getLock() ) {
    println "end"
    System.exit(1)
}

Thread.start{
	while(true) {
	    println "test"
	    sleep(1000)
	}
}

Lock#getLockメソッド実行結果がtrueならロック取得成功、falseならロック取得失敗となる。
上記スクリプトを2つ以上起動させようとしても後で起動した方が異常終了するようになる。