Objective-c を使用して Mac でコマンド ライン アプリケーションを作成しています。
アプリケーションの開始時に、同じアプリケーションの別のインスタンスが既に実行されているかどうかを確認したい。そうであれば、終了するのを待つか、現在のインスタンスを終了するか、他のインスタンスを終了するなどのいずれかを行う必要があります。
これを行う方法はありますか?
Objective-c を使用して Mac でコマンド ライン アプリケーションを作成しています。
アプリケーションの開始時に、同じアプリケーションの別のインスタンスが既に実行されているかどうかを確認したい。そうであれば、終了するのを待つか、現在のインスタンスを終了するか、他のインスタンスを終了するなどのいずれかを行う必要があります。
これを行う方法はありますか?
このための標準的なUnixソリューションは、「実行ファイル」を作成することです。起動時に、そのファイルを作成し、存在しない場合はpidをそのファイルに書き込もうとします。存在する場合は、そのpidを読み取り、そのpidとプロセス名で実行中のプログラムがある場合は、wait / exit/whatever。
問題は、そのファイルをどこに置き、何と呼ぶかということです。
さて、最初に、あなたは正確に「すでに実行中」が何を意味するかを決定しなければなりません。明らかに「世界のどこでも」ではありませんが、「現在のマシンのどこでも」から「現在のデスクトップセッションのどこでも」のいずれかである可能性があります。(たとえば、ユーザーAがプログラムを開始して一時停止した場合、ユーザーBがやって来て、ユーザーの高速切り替えを介してコンピューターを引き継ぎます。プログラムを実行できるかどうか。)
その質問に対するほとんどすべての合理的な答えには、明らかなパス名パターンがあります。たとえば、Macでは、/ tmpはシステム全体で共有されますが、$ TMPDIRは特定のセッションに固有であるため、たとえば/ tmp / $ {ARGV [0]}。pidは、「1つだけ」と言うのに適した方法です。 $ {TMPDIR} / $ {ARGV [0]}。pidは、「セッションごとに1つのコピーのみ」と言うのに適した方法です。
ありがとう@abarnert。
これが私が現在実装している方法です。main() の開始時に、.lock という名前のファイルがバイナリ自体のディレクトリに存在するかどうかを確認します (/tmp に移動することを検討しています)。存在する場合、アプリケーションは終了します。
そうでない場合は、ファイルを作成します。アプリケーションの最後に、.lock ファイルが削除されます
私はまだ pid をそのファイルに書き込んでいませんが、前のインスタンスを終了する必要がある場合は書き込みます (現時点では必要ありませんが、将来的には必要になる可能性があります)。PIDは次を使用して取得できると思います
int myPID=[[NSProcessInfo processInfo] processIdentifier];
プログラムは、ルート デーモンとして実行されているカスタム スケジューラによって呼び出されます。したがって、ルートとして実行されます。
答えを見ると、問題を解決する直接的な方法はないと思います。
これを行う簡単で一般的な方法は、プロセス リストで実行可能ファイルの名前を確認することです。
ps - A | grep <your executable name>