[Powershell] 簡単に実装できるMutexを利用した多重起動禁止処理


はじめに

作成したPowershellスクリプトをサーバ環境で実行させる場合、複数ユーザが実行してしまう可能性を考慮し、多重軌道を禁止する処理をmutexにて実装します。

実装

mutexの実装はとても簡単で、System.Threading.Mutexを利用します。

$mutexObj = New-Object System.Threading.Mutex -ArgumentList $false, "Global¥$(split-Path -Path $PSCommandPath -Leaf)"

try{
    # foobaa
} catch [System.Threading.AbandonedMutexException] {
    # The previous execution was forcibly terminated.
} finally {
    $mutexObj.ReleaseMutex()
    $mutexObj.Close()
}

まず$mutexObjとしてオブジェクトを作成します。

この時の引数ですが、第2引数は実行したPowershellScriptのファイル名を指定しています。

実際の処理はtry-catch-finallyの中に記載します。

最後のfinally部分でmutexを開放します。

powershellのfinallyに記載しておく理由としては、途中でreturn や exitなどが呼ばれた時に開放忘れがないようにするためです。

finallyはreturn する前に必ず呼ばれます。

最後に

いかがでしたでしょうか。

どのアプリケーションでも多重起動の禁止処理は必要な処理となります。

powershellスクリプトでも同様に、多重起動の禁止処理は入れておくと良いかと思います。