Страница 1 из 1

flock (нужен экзампл)

Добавлено: 2013-07-18 11:11:51
bRUtality
Прошу показать примерчик использования утилиты flock через cron для предотвращения повторного запуска целевого скрипта.
ОС - freebsd 8.2.
Мой вариант:

Код: Выделить всё

*/10 * * * * /usr/local/bin/flock -c /path_to_script/myscript.lock /usr/local/bin/python  /path_to_script/myscript.py 1>>/path_to_script/cron_out.log 2>>/path_to_script/cron_err.log

В обычном режиме все это работает: скрипт запускается, отрабатывает, логи пишутся. Но в час пик был запущен второй экземпляр скрипта, а потом третий и так далее...
Вобщем, нужен примерчик, обрабатывающий такую ситуацию: если скрипт не отработал, то не запускать еще один экземпляр.
Заранее спасибо.

Re: flock (нужен экзампл)

Добавлено: 2013-07-18 13:24:18
Alvares
в скрипте pid указывать и проверку делать? Есть примеры демонов, можно по образцу

Re: flock (нужен экзампл)

Добавлено: 2013-07-18 13:31:01
bRUtality
Alvares писал(а):в скрипте pid указывать и проверку делать? Есть примеры демонов, можно по образцу
Склоняюсь к тому, чтобы сделать свой flock с барышнями и преферансом, причем прямо внутри самого скрипта. Но почему-то, при запуске из под cron, питоновский скрипт не может найти свой процесс.
Делаю так:

Код: Выделить всё

result = os.system("ps -ax | grep" + myscript.py)

result парсим и тягаем оттуда инфу, заущен скрипт или нет. Если запускать в консоли, то все это работает, а если из-под cron, то result - пустой.

Re: flock (нужен экзампл)

Добавлено: 2013-07-18 13:51:08
Charlz_Klug_
bRUtality писал(а): Делаю так:

Код: Выделить всё

result = os.system("ps -ax | grep" + myscript.py)

result парсим и тягаем оттуда инфу, заущен скрипт или нет. Если запускать в консоли, то все это работает, а если из-под cron, то result - пустой.
Пробуйте полные пути для ps и grep, может и для myscript.py надо указать.

Re: flock (нужен экзампл)

Добавлено: 2013-07-18 13:56:26
bRUtality
Для myscript полный путь не требуется, ведь grep ищет по вхождению части слова. А вот полные пути для ps и grep - это мысль!

Re: flock (нужен экзампл)

Добавлено: 2013-07-18 15:50:54
bRUtality
bRUtality писал(а):А вот полные пути для ps и grep - это мысль!
Увы, не прокатило. Вернул пустой набор.
Что интересно, когда вместо имени скрипта подставил "cron", то результат был.

Re: flock (нужен экзампл)

Добавлено: 2013-07-18 20:08:16
Charlz_Klug_
bRUtality писал(а):Что интересно, когда вместо имени скрипта подставил "cron", то результат был.
Погрепайте то, что у вас постоянно висит в процессах. Покажет или нет?

Re: flock (нужен экзампл)

Добавлено: 2013-07-19 8:21:30
bRUtality
Charlz_Klug_ писал(а):
bRUtality писал(а):Что интересно, когда вместо имени скрипта подставил "cron", то результат был.
Погрепайте то, что у вас постоянно висит в процессах. Покажет или нет?
Из консоли? Да, грепается. А из под cron'а - нет.

Re: flock (нужен экзампл)

Добавлено: 2013-07-19 11:38:02
Charlz_Klug_
bRUtality писал(а):Из консоли? Да, грепается. А из под cron'а - нет.
УМВР.

Код: Выделить всё

[Charlz_Klug@Meleena]/root>$ cat /etc/crontab | grep /bin/ps
*/5     *       *       *       *       root    /bin/ps ax|/usr/bin/grep smbd
[Charlz_Klug@Meleena]/root>$
[Charlz_Klug@Meleena]/root>$ sudo tail mbox
50023  ??  I        0:00.02 /usr/local/sbin/smbd -D -s /usr/local/etc/smb.conf
50225  ??  I        0:00.02 /usr/local/sbin/smbd -D -s /usr/local/etc/smb.conf
50243  ??  S        0:00.02 /usr/local/sbin/smbd -D -s /usr/local/etc/smb.conf
50487  ??  S        0:00.01 /usr/local/sbin/smbd -D -s /usr/local/etc/smb.conf
50516  ??  I        0:00.01 /usr/local/sbin/smbd -D -s /usr/local/etc/smb.conf
50802  ??  S        0:00.01 /usr/local/sbin/smbd -D -s /usr/local/etc/smb.conf
50820  ??  Ss       0:00.01 /bin/sh -c /bin/ps ax|/usr/bin/grep smbd
50823  ??  S        0:00.00 /usr/bin/grep smbd
94074  ??  I        0:02.33 /usr/local/sbin/smbd -D -s /usr/local/etc/smb.conf

[Charlz_Klug@Meleena]/root>$
Давайте целиком ваш питоновский сценарий.

Re: flock (нужен экзампл)

Добавлено: 2013-07-19 13:42:01
bRUtality
Сами напросились :)
Скрипт myscript.py (ищет свою же копию в процессах):

Код: Выделить всё

output = commands.getoutput("/bin/ps -ax " /usr/bin/grep myscript.py")
proginfo = string.split(output)
print proginfo
Выдает массив, в котором содержится инфа по процессу (pid, название, оунер и т.п.).
Теперь мы хотим запустить его в кроне:

Код: Выделить всё

*/10 * * * * /usr/local/bin/python  /path_to_script/myscript.py 1>>/path_to_script/cron_out.log 

В cron_out.log печатается Я ответил на ваш вопрос?

Re: flock (нужен экзампл)

Добавлено: 2013-07-19 14:30:02
Charlz_Klug_

Код: Выделить всё

[Charlz_Klug@Meleena]~>$ cat sample.py 
#!/usr/local/bin/python -O
import subprocess
import string
subprocess.call("/bin/ps ax|/usr/bin/grep sample", shell=True)

[Charlz_Klug@Meleena]~>$ 
Результат:

Код: Выделить всё

Message 3:
From root@Meleena.local Fri Jul 19 16:25:00 2013
Date: Fri, 19 Jul 2013 16:25:00 +0500 (UZT)
From: root@Meleena.local (Cron Daemon)
To: root@Meleena.local
Subject: Cron <root@Meleena> /home/Charlz_Klug/sample.py
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>

52549  ??  Ss       0:00.06 /usr/local/bin/python -O /home/Charlz_Klug/sample.p
52551  ??  S        0:00.01 /bin/sh -c /bin/ps ax|/usr/bin/grep sample
52553  ??  S        0:00.00 /usr/bin/grep sample

& 

Re: flock (нужен экзампл)

Добавлено: 2013-07-19 14:32:54
bRUtality
А теперь запустите это в кроне :)

Re: flock (нужен экзампл)

Добавлено: 2013-07-19 16:01:56
Neus
bRUtality писал(а):А теперь запустите это в кроне :)
это крон намылил чего он запустил, внимательнее смотрите :)

Код: Выделить всё

output = commands.getoutput("/bin/ps -ax " /usr/bin/grep myscript.py")
после -ах " а должно быть |
--
а не проще заюзать pgrep ?

Re: flock (нужен экзампл)

Добавлено: 2013-07-19 18:06:51
Charlz_Klug_
bRUtality писал(а):А теперь запустите это в кроне :)
Вы не поверите, запускалось в кроне:

Код: Выделить всё

[Charlz_Klug@Meleena]~>$ cat /etc/crontab | grep sample
*/5	*	*	*	*	root	/home/Charlz_Klug/sample.py
[Charlz_Klug@Meleena]~>$ 
.

Re: flock (нужен экзампл)

Добавлено: 2013-07-19 20:44:23
bRUtality
Neus писал(а): это крон намылил чего он запустил, внимательнее смотрите :)
хм... попробую еще раз, может где опечатался
Neus писал(а): после -ах " а должно быть |
В оригинале есть. Похоже, форумный парсер съел этот символ.