Имя: Пароль:
IT
Админ
Проверка запущенности процедуры
,
0 Злобная Печенька
 
23.10.14
12:09
Всем привет. ТОваг'ищи, нужен совет бывалых. Есть процедура на оракл, есть sh в кроне, который каждые 5 минут эту процедуру пинает. СЕйчас колдую над проверкой запущенности процедуры и пока не понимаю, как это реализовать. Что проще реализуемо и лучше по производительности- дописать процедуру, на проверку запущенности самой себя, или дописать sh-ник, чтобы проверял запущенность своей копии?
1 Злобная Печенька
 
23.10.14
12:16
Реализовать все это джобом нет возможности, так как в .sh проверяется, запущен ли клиент. и если клиент не запущен, процедура не исполняется.
2 kokamoonga
 
23.10.14
14:19
(0) а не судьба какой-нибудь флаг передергивать при запуске/завершении? Писать его куда угодно, хоть просто в файл
3 Looser-1c
 
23.10.14
14:20
(2) Файл плохо...

(0) Лучше в процедуре это делай.
4 kokamoonga
 
23.10.14
14:22
(3) >>> Файл плохо...

Тут наверно и какие-то аргументы будут?
5 France
 
23.10.14
14:22
семафор... при первом входе в истину.
6 Kalambur
 
23.10.14
14:22
(0)+(1) ну тут же все очевидно что нужно "дописать sh-ник"
7 Looser-1c
 
23.10.14
14:24
(4) Ага. Скрипт в корку вылетит, а файл останется
8 kokamoonga
 
23.10.14
14:28
(7) И как предполагается внешний контроль в сочетании с "Лучше в процедуре это делай."?
9 Looser-1c
 
23.10.14
14:30
(8) я делал так - накладывал hold lock на служебную таблицу в начале работы и снимал его в конце.
Преимущество - лок сам снимается при авосте.
10 kokamoonga
 
23.10.14
14:35
(9) Блокировка в качестве флага?.. Свежо.

Жаль что изобретатели .pid-файлов до такого не додумались
11 Злобная Печенька
 
23.10.14
16:27
(2) А поподробнее можно? )))
12 kokamoonga
 
24.10.14
03:02
(11) Каких подробностей ты желаешь?

При запуске ставить флаг, при завершении снимать его. При этом абсолютно неважно куда он будет записан: в файл, в таблицу, в переменную окружения и так далее.

Как верно заметил коллега в (7)  может случиться ситуация, что процесс упадет, получит SIGKILL или еще что, а флаг останется взведенным. Поэтому логично писать куда-то идентификатор процесса, а при запуске сверять. Собственно я ничего нового не изобретаю сейчас. В упрощенном виде так работает почти любой демон с pid-файлами.

1. При запуске проверяется существование файла somedaemon.pid по определенному пути.
2. Если файл не существует запускается процесс и создается файл с записью в него pid процесса.
3. Если файл существует, производится поиск процесса по pid  и валидация. Например, у меня сейчас в /var/run/nginx/ лежит  файл nginx.pid с содержанием 1439

~$ ps ax | grep 1439
1439 ?        Ss     0:00 nginx: master process /usr/sbin/nginx

Я хочу убедиться, что это именно nginx:
~$ ps -A | grep 1439 | awk '{print$4}'
nginx

Если я сейчас попробую сказать # service nginx start, то ничего не произойдет.

Соответственно, если процесс существует и проходит валидацию, то скрипт не запускается. В противном случае см. пункт 2.

При это не обязательно это должен быть pid процесса и не обязательно запись в файл. Любой удобный способ хранить любой удобный идентификатор процесса.
13 vicof
 
24.10.14
07:18
Ваша процедура очень запущенная, мадемуазель))
14 Woldemar22LR
 
24.10.14
07:47
(7) было такое - бегал с нетбуком цеплялся по SSH и звонил разработчикам какой файл удалить :)  Разработчики предложили доработать программу за скромный полтинник.
15 DrZombi
 
гуру
24.10.14
09:05
(0) Пиши, какой либо признак запущенности в какую либо табличку... Или файл (на худой конец) :)

Момент выхода из процедуры, очищай признак... или Удаляй файл.

..
Можешь еще сделать счетчик, который будет меняться с интервалом... А лучше время :)
Что бы понять, что процедурка не подвисло :)
16 Злобная Печенька
 
24.10.14
15:07
(12) Спасибо за подробный ответ.  Буду пытаться))
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший