Как проверить, запущен ли другой экземпляр приложения / двоичного файла

Я пишу приложение командной строки в Mac, используя Objective-C

В начале приложения я хочу проверить, запущен ли другой экземпляр того же приложения. Если это так, то я должен либо дождаться его завершения, либо выйти из текущего экземпляра, либо выйти из другого экземпляра и т. Д.

Есть ли способ сделать это?

3 ответа

Решение

Стандартное решение Unix для этого заключается в создании "файла запуска". Когда вы запускаете, вы пытаетесь создать этот файл и записать в него свой pid, если он не существует; если он существует, прочитайте pid из него, и если есть запущенная программа с этим pid и именем вашего процесса, подождите / выйдите / что угодно.

Вопрос в том, куда вы положили этот файл и как вы его называете?

Ну, во-первых, вы должны решить, что именно означает "уже работает". Очевидно, что не "где-нибудь в мире", но это может быть что угодно, от "где-нибудь на текущем компьютере" до "в текущем сеансе рабочего стола". (Например, если пользователь A запускает вашу программу, приостанавливает ее, затем появляется пользователь B и принимает на себя управление компьютером посредством быстрого переключения пользователей, сможет ли она запустить программу или нет?)

Для практически любого разумного ответа на этот вопрос есть очевидная схема. Например, на Mac /tmp является общим для всей системы, а $TMPDIR специфичен для данного сеанса, поэтому, например, /tmp/$‹ARGV[0][.pid - хороший способ сказать "только один копировать на машину, точка ", тогда как ${TMPDIR}/${ARGV[0]}.pid - это хороший способ сказать" только одна копия за сеанс ".

Простой, но распространенный способ сделать это - проверить список процессов на наличие имени вашего исполняемого файла.

ps - A | grep <your executable name>

Спасибо @abarnert.

Вот как я сейчас реализовал. В начале main() я бы проверил, существует ли файл с именем.lock в собственном каталоге бинарного файла (я подумываю переместить его в /tmp). Если это так, приложение закрывается.

Если нет, то это создаст файл. В конце приложения удаляется файл.lock

Я еще не записал pid в этот файл, но при выходе из предыдущего экземпляра это потребуется (пока он мне не нужен, но может в будущем). Я думаю, что PID можно получить с помощью

int myPID=[[NSProcessInfo processInfo] processIdentifier];

Программа будет вызываться пользовательским планировщиком, который работает как корневой демон. Так что это будет запускаться от имени пользователя root.

Видя ответы, я бы предположил, что не существует прямого метода решения проблемы.

Другие вопросы по тегам