У меня есть исполняемый файл (нет источника), который мне нужно обернуть, чтобы он не вызывался более одного раза за раз. Я сразу же думаю о какой-то оболочке очереди, но как я могу сделать ее так, чтобы моя оболочка вызывалась вместо самого исполняемого файла? Есть лучший способ сделать это? Решение должно быть невидимым, поскольку пользователи - это другие приложения. Любая информация/рекомендации приветствуются.Как я могу обернуть исполняемый файл в UNIX (SunOS), чтобы он никогда не запускался более одного раза в одно и то же время?
ответ
Способ 1: Поместите исполняемый файл в некотором месте, не входящем в стандартный путь. Создайте сценарий оболочки, который проверяет файл часового и, если отсутствующий файл-дозор, выполняет программу, ждет завершения ptogram, а затем удаляет файл-дозор. Если файл дозорного файла присутствует, скрипт будет вводить цикл с небольшой задержкой (1 секунда? Как долго выполняется стандартное выполнение этой программы? Возьмите это и половину), снова проверьте доступный файл и т. Д.
Способ 2. Создайте отдельную программу, которая выполняет ту же функцию, что и скрипт, но вместо этого использует семафор на уровне системы или блокировку. Вы даже можете просто использовать блокировку чтения/записи в файле. Программа выполнила бы fork() и exec() в реальной программе, ожидая выхода ребенка перед очисткой дозорного.
Если небрежно реализованы оба метода, это может привести к условиям гонки (например, если два процесса проверяют и обнаруживают, что файл дозорного файла отсутствует, а затем оба пытаются его создать). Внимательно выберите атомную операцию, например, создание каталога в известном месте и убедитесь, что операция выполнена успешно. –
Согласен, поэтому я лично предпочитаю вариант 2. Если вы попытаетесь создать каталог, вы можете заблокировать исключение и вернуться в цикл ожидания. Это невозможно с вариантом 1. Преимущество варианта 1 состоит в том, что вам не нужно много работать, чтобы реализовать его. О, и не используйте файл в/tmp для дозорного. Поместите его в безопасное место. – jfawcett
Если пользователи - это другие приложения, вы можете просто переименовать исполняемый файл (например, имя -> name.real) и вызвать оболочку с исходным именем. Чтобы убедиться, что он вызывается только один раз за раз, вы можете использовать команду pidof
(например, pidof name.real
), чтобы проверить, запущена ли программа уже (pidof
фактически предоставляет вам PID выполняющегося процесса, чтобы вы могли использовать такие вещи, как kill
или что угодно, чтобы отправлять ему сигналы).
Спасибо вам всем! Мне понадобилось время подумать об этих решениях! –