процессы linux (процесс который загружает сам себя 1 раз)
Модератор: Модераторы разделов
-
k0s
- Сообщения: 1
- ОС: gentoo linux
процессы linux
Суть вопроса такова, необходмо чтоб программа (процесс) запустил себя всего 1 раз. Думаю что необходимо использовать мютексы или семафоры, но как не могу разобраться, еще слышал что-то про так называемый "коэффициент злости" ... Программирование изучаю второй месяц, буду рад любой информации (исходники, литература, советы... и т.д.).
-
Mage-Warrior
- Сообщения: 869
- Статус: Семь раз понюхай, один раз откуси!
- ОС: SlackWare 12.1
Re: процессы linux
Говорят, самый простой способ - создание pid-файла, в котором соотвественно хранится pid запущенного процесса. Конечно, в этом случае ваша программа (процесс) должна проверять наличие и валидацию процеса с таким pid. Вот все, что знаю. 
---- После немного google ----
Совсем забыл про lock-файлы - тоже вариант. Файл должен быть открыт запущенным процессом и удерживаться вплоть до его завершения. Новый процесс обязан завершиться при обнаружении "занятости" lock-файла.
---- После немного google ----
Совсем забыл про lock-файлы - тоже вариант. Файл должен быть открыт запущенным процессом и удерживаться вплоть до его завершения. Новый процесс обязан завершиться при обнаружении "занятости" lock-файла.
*- Большинство проблем, дружок, завсегда покажет лог! -*
-
Mage-Warrior
- Сообщения: 869
- Статус: Семь раз понюхай, один раз откуси!
- ОС: SlackWare 12.1
Re: процессы linux
Что я нашёл-то! Вот!
P.S. www.opennet.ru - обратите внимание.
P.S. www.opennet.ru - обратите внимание.
*- Большинство проблем, дружок, завсегда покажет лог! -*
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: процессы linux
Самое правильное, видимо, решение - семафор.
Можно ещё обратить внимание на то, как это сделано в гимпе (тут, правда, своя специфика): запускаясь, проверяем наличие некоторого dbus-сервиса. Если есть - передаём ему параметры, с которыми нас запустили (имя файла) и завершаемся. Если нет - создаём такой сервис и работаем дальше.
Можно ещё обратить внимание на то, как это сделано в гимпе (тут, правда, своя специфика): запускаясь, проверяем наличие некоторого dbus-сервиса. Если есть - передаём ему параметры, с которыми нас запустили (имя файла) и завершаемся. Если нет - создаём такой сервис и работаем дальше.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
Voice
- Сообщения: 1073
- Статус: столлманист
- ОС: Debian GNU/Linux
Re: процессы linux
А почему семафор? Тогда уже мютекс лучше.
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
М. В. Ломоносов
-
Voice
- Сообщения: 1073
- Статус: столлманист
- ОС: Debian GNU/Linux
Re: процессы linux
Ааа... тогда пардон
В винде вроди точно есть.
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
М. В. Ломоносов
-
Subj
- Сообщения: 151
- Статус: Useful
- ОС: win
Re: процессы linux
Экзотический способ:
Заставить процесс прослушивать какой-нибудь tcp-порт, аля 64000-й. Второй процесс тогда получит ошибку при попытке открыть "listener" на этот порт (от балды счас придумал
)
Заставить процесс прослушивать какой-нибудь tcp-порт, аля 64000-й. Второй процесс тогда получит ошибку при попытке открыть "listener" на этот порт (от балды счас придумал
Building better software with Ada
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: процессы linux
да нет. как раз обычный способ, наверное других и нет - занять ресурс, который может занять только кто-то один. Например уникальный pid файл. Или порт, как у вас.
-
merl
- Сообщения: 5
- ОС: Linux x86 - Ubuntu Intrepid
Re: процессы linux
В венде есть мьютексы, в линуксе их нет вообще ) (ну можт в последнее время надобавляли, конечно, но изначально не было - только семафоры). Но, к слову сказать, мьютекс - это просто логический семафор. И да, и те, и другие в линуксе межпроцессные (они для этой самой межпроцессной коммуникации и создавались). Есть функции создания семафора, есть "открытия" если позволяют права доступа, выставленные процессом-создателем. Осталось выбрать id и вперед
-
gmorgunov
- Сообщения: 27
- ОС: linux mandriva2007
Re: процессы linux
Добрый ...
Можно попробовать на питоне сделать, сам в нем новичек, но интуитивно понятно.
Вот код на python:
Вот вывод:
mike@linux:~> ./p.py
Процесс 1 запрашивает ресурс A
Процесс 1 получил ресурс A
Процесс 1 запрашивает ресурс A
Процесс 1 выполняется
Процесс 1 закончил выполнение
Процесс 1 получил ресурс A
Процесс 1 выполняется
Процесс 1 закончил выполнение
Вроде все, что вам требуется( если не понял то увы
)
Подробно можно посмотреть: http://www.intuit.ru/department/pl/python/11/
Можно попробовать на питоне сделать, сам в нем новичек, но интуитивно понятно.
Вот код на python:
Код: Выделить всё
#!/usr/bin/python
# coding: utf-8
import threading, time
resource = {'A': threading.Lock()}
def proc(n, rs):
for r in rs:
print "Процесс %s запрашивает ресурс %s" % (n, r)
resource[r].acquire()
print "Процесс %s получил ресурс %s" % (n, r)
time.sleep(1)
print "Процесс %s выполняется" % n
for r in rs:
resource[r].release()
print "Процесс %s закончил выполнение" % n
p1 = threading.Thread(target=proc, name="t1", args=["1", "A"])
p2 = threading.Thread(target=proc, name="t1", args=["1", "A"])
p1.start()
p2.start()
p1.join()
p2.join()Вот вывод:
mike@linux:~> ./p.py
Процесс 1 запрашивает ресурс A
Процесс 1 получил ресурс A
Процесс 1 запрашивает ресурс A
Процесс 1 выполняется
Процесс 1 закончил выполнение
Процесс 1 получил ресурс A
Процесс 1 выполняется
Процесс 1 закончил выполнение
Вроде все, что вам требуется( если не понял то увы
Подробно можно посмотреть: http://www.intuit.ru/department/pl/python/11/
-
halturin
- Сообщения: 167
- ОС: Linux
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: процессы linux
А может такие сложности не нужны? Может вполне достаточно будет запускать копию с аргументом в командной строке (типа --norun), а в коде смотреть - если нет такого аргумента - запускать с аргументом, есть - просто выполнять необходимую работу. Примерно так:
Код: Выделить всё
int main( int argc, char** argv ) {
if( argc < 2 || stricmp( argv[0], "--norun" ) ) {
// запуск второй проги в виде "myprog --norun"
}
}-
minoru-kun
- Сообщения: 621
- ОС: Debian GNU/Linux
-
merl
- Сообщения: 5
- ОС: Linux x86 - Ubuntu Intrepid
Re: процессы linux
minoru-kun писал(а): ↑11.11.2008 12:36
Такой подход имеет право на существование, но замечу, что это - не UNIX-школа (в UNIX это, конечно же, было бы сделано на pid-файле). Хотя, под линуксом или виндой, наверное, нормально.
ну, приехали.. как это не unix ) использовать тормозную ФС для межпроцессных блокировок? ) нет, я не спорю, что конкретно эта задача действительно решается проще теми же pid-файлами, но если ознакомиться с API ядровых объектов блокировок, можно увидеть полную аналогию ФС - т.е. вездесущую в юниксе концепцию "все есть файл". На семафор задается владелец, группа и права использования.. чем не файл ) только работает в разы быстрее ибо находится на ядерном уровне и исключает некоторые неприятные моменты ФС..
-
AestheteAnimus
- Сообщения: 135
- ОС: FreeBSD 8.0-RELEASE amd64
Re: процессы linux
У. Стивенс "UNIX Взаимодействие процессов".
После прочтения подобные вопросы отпадут сами собой.
После прочтения подобные вопросы отпадут сами собой.
-
Женя Подсыпальников
- Сообщения: 482
Re: процессы linux
Некоторая зашибатая программа -
должна уметь убрать тот или иной вертикально выставленный флаг за собой прочь.
Это можно делать, например, явно,
вызывая топор на рубку древка во последних строках главной функции.
Но - иногда - указатель инструкции на исполнение -
не достигает этих последних строк, например, по вылету на некотором исключении,
после которого - программа не запустится и в первый раз боле,
ввиду несрубленного системного межпроцессового флагу...
Вот почему - зашибатым приёмом реализации поведения похожей ответственности -
является объявление класса флажконосова объекта,
коий во своём конструкторе водружает,
а во своём деструкторе низвергает тот или иной флаг.
Объекту такого класса -
просто разрешают пожить во начальных строках главной функции программы
и...
...забывают о нём, ведь выйди программа (нормально ли абнормально) -
вызовется деструктор знаменосца
Мне интересно, однако,
как заканчивается некоторая программа по комманде "kill" -
можа, кто ведает ?
должна уметь убрать тот или иной вертикально выставленный флаг за собой прочь.
Это можно делать, например, явно,
вызывая топор на рубку древка во последних строках главной функции.
Но - иногда - указатель инструкции на исполнение -
не достигает этих последних строк, например, по вылету на некотором исключении,
после которого - программа не запустится и в первый раз боле,
ввиду несрубленного системного межпроцессового флагу...
Вот почему - зашибатым приёмом реализации поведения похожей ответственности -
является объявление класса флажконосова объекта,
коий во своём конструкторе водружает,
а во своём деструкторе низвергает тот или иной флаг.
Объекту такого класса -
просто разрешают пожить во начальных строках главной функции программы
...забывают о нём, ведь выйди программа (нормально ли абнормально) -
вызовется деструктор знаменосца
Мне интересно, однако,
как заканчивается некоторая программа по комманде "kill" -
можа, кто ведает ?
Пойдём на рыбалку !
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: процессы linux
... Потому и предлагается использовать предоставляемые ядром объекты, такие как семафоры - они освобождаются при любом варианте завершения процесса.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru