Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Crontab

12K
09 ноября 2011 года
ASoftware
87 / / 16.04.2009
Собственно главный вопрос:
Какие задачи выполняет cron помимо тех что заданы с помощью crontab -e ?

Почему спрашиваю:
Скрипт на сервере выполняется каждую минуту, берет значения из базы и выполняет долгий процесс... Нужно чтобы cron не выполнял тоже действие через минуту, если скрипт не закончил работу. Сам скрипт - на php.

Варианты с созданием файла, - отпадают, ненадежно. А если еще обработку ошибок отрабатывать (время скрипта замерять, время создания и т.д... Корочее это не подходит).

flock тоже не подходит, так как не работает в nfs.

Думаю написать приложение которое запускает этот скрипт на асме, и в след. раз проверяет не запущено ли оно уже. Т.е. просто запускать скрипт из под этого приложения:
 
Код:
mov eax, 11
mov ebx, shell
xor ecx, ecx
xor edx, edx
int 0x80
---------------
shell db '#!/usr/bin/php5 /home/admin/www/cron.php',0


И вначале проверять не запущено ли оно, если да то exit.

Так вот и думаю, а не убить ли просто процесс crontab да и не мучатся, но боюсь. Не повлияет ли это на работу системы...

Кто что скажет?
260
09 ноября 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: ASoftware

Думаю написать приложение которое запускает этот скрипт на асме, и в след. раз проверяет не запущено ли оно уже. Т.е. просто запускать скрипт из под этого приложения:
 
Код:
mov eax, 11
mov ebx, shell
xor ecx, ecx
xor edx, edx
int 0x80
---------------
shell db '#!/usr/bin/php5 /home/admin/www/cron.php',0


И вначале проверять не запущено ли оно, если да то exit.

Так вот и думаю, а не убить ли просто процесс crontab да и не мучатся, но боюсь. Не повлияет ли это на работу системы...

Кто что скажет?



Считаю, что ASoftware заслуживает оценки отлично за предложенное решение.

12K
10 ноября 2011 года
ASoftware
87 / / 16.04.2009
Спасибо, но боюсь не все так гладко.
Начал писать, наткнулся на ошибку, оказалось передача параметров происходит немного по-другому, вот так правильно:
Код:
format ELF executable
entry start
 
segment readable executable
 
start:
        mov    eax,11
        mov    ebx,shell
        mov    ecx,argumenty
        mov    edx,0
        int    0x80
; lets write something
mov eax, 4
        xor ebx, ebx
        inc ebx
        mov ecx, somestring
        mov edx, [len]
        int 0x80  
segment readable writeable

shell         db      "/usr/bin/php5", 0  ; program to run
arg1            db      "/home/admin/www/cron.php", 0

argumenty       dd      shell         ; argv[0] is the program name
                dd      arg1            ; argv[1]
                dd      0               ; end of parameter list

somestring db 'process has been closed',0
len dd 23


Но суть не в параметрах.
Оказывается скрипт передает управление cron.php и закрывается, т.е. 'process has been closed' уже не выведется.

Кто подскажет как сделать так чтобы процесс остался в памяти.

Для unix не программировал, поэтому думал что процесс будет висеть в память как в винде ,ан нет(((

p.s. Кроме 11й функции есть схожая 59. Чем они отличаются?
285
10 ноября 2011 года
Romik
479 / / 24.11.2002
Нормальной практикой считается создание файла для блокировки запуска. Скрипт, при запуске должен проверять время создания файла, если файл создан 2 часа назад (а по расчётам долгий процесс может работать час-полтора), то файл нужно удалить и создать новый.
Ещё есть в самом файле можно хранить pid процесса, перед запуском проверять наличие существования процесса по pid. Если файл с pid существует, а процесса нет, то файл смело можно обновить и выполнять задачу штатным образом.
12K
10 ноября 2011 года
ASoftware
87 / / 16.04.2009
 
Код:
Нормальной практикой считается создание файла для блокировки запуска. Скрипт, при запуске должен проверять время создания файла, если файл создан 2 часа назад (а по расчётам долгий процесс может работать час-полтора), то файл нужно удалить и создать новый.

Давай представим что в php max_execution_time стоит 2 часа. На 5й минуте я перезагрузил сервер. Остальные 1:55 скрипт просто не будет запускаться. Такой простой на 2 часа мне не подходит, сори...
Что касается блокировки файла по flock - сначала он мне понравился, но не работает в nfs...

Цитата:
Ещё есть в самом файле можно хранить pid процесса, перед запуском проверять наличие существования процесса по pid. Если файл с pid существует, а процесса нет, то файл смело можно обновить и выполнять задачу штатным образом.


Тоже вариант, и вроде не плохой... Но все таки нацелился выполнить это программно...

Возвращаясь к моему предыдущему посту:
Ведь не может быть чтобы вот так вот по sys_execve приложению передавалось управление, и возврата уже не было.. Многие программы написаны так:

Какие-то переменные, вычисления...
exec 'что-то';
exec 'еще что-то';
Вывод результатов
Выход...

Или в стек надо сувать адрес возврата? Но ведь все равно приложение запущено не будет, а только в начале и в конце.А если до этого хранились переменные в памяти, они все стираются? Не хорошо. Или я не ту функцию использую?

Сорри за много буков но я с трудом нашел функции 0х80 прерывания, при чем все они очень скудно описаны, поэтому так много вопросов.

p.s. Еще один))):
Так что все таки будет с системой, если отрубить крон вначале выполнения скрипта, а в конце запустить его обратно? :) Я к тому что: Не выполняет ли cron каких нибудь системных критических процессов?

240
10 ноября 2011 года
aks
2.5K / / 14.07.2006
Мне кажется вы куда то слишком в дебри ушли от решения проблемы. Pid файл является классическим способом избежать повторного запуска. Если считаете, что ненадежно (кстати чем?), ну воспользуйтесь IPC любым. Семафорами хотя бы (которые кстати тоже файлы в shred memory =) ). Только тут есть проблема: если ваш процесс упадет и не отпустит семафор, то он так и останется залоченым - никто за вас его разлочивать не будет. Придется ждать семафор некий таймаут и потом опять же через pid файл проверять жив ли процесс. Хотя может вас другое поведение устроит - например гарантированно выполниться через таймаут.
12K
10 ноября 2011 года
ASoftware
87 / / 16.04.2009
Цитата:
Мне кажется вы куда то слишком в дебри ушли от решения проблемы. Pid файл является классическим способом избежать повторного запуска. Если считаете, что ненадежно (кстати чем?), ну воспользуйтесь IPC любым


PHP скрипт запускает ffmpeg, qt-faststart, записывает в базы значения и т.д. .. PID какого конкретно процесса мне проверять ? php? ffmpeg? Поэтому этот вариант то и не подходит.

Да я не спорю, можно многими способами это сделать, но не все подходят именно под мои нужды.

240
10 ноября 2011 года
aks
2.5K / / 14.07.2006
Цитата: ASoftware
PHP скрипт запускает ffmpeg, qt-faststart, записывает в базы значения и т.д. .. PID какого конкретно процесса мне проверять ? php? ffmpeg? Поэтому этот вариант то и не подходит.


Ну скрипт же их по очереди запускает и надо дождаться пока именно скрипт завершиться а не ффмпег? Вот pid скрипта и надо записывать.

12K
10 ноября 2011 года
ASoftware
87 / / 16.04.2009
Вот если бы ты сказал как узнать именно PID самого скрипта, (который /home/admin/www/cron.php) вот это было бы здорово.
240
10 ноября 2011 года
aks
2.5K / / 14.07.2006
Дык яж не шарю в php, но должен же быть какой то способ доступа к api.
Пара секунд поиска в гугле подсказали это: http://php.net/manual/en/function.posix-getpid.php
240
10 ноября 2011 года
aks
2.5K / / 14.07.2006
Вот еще, походу тоже самое:
http://php.net/manual/en/function.getmypid.php
277
10 ноября 2011 года
arrjj
1.7K / / 26.01.2011
 
Код:
gedit &
shPID=$!
echo $shPID
ps -Ae|grep $shPID
kill -9 $shPID
240
10 ноября 2011 года
aks
2.5K / / 14.07.2006
Так не надо делать. Тем более это не решение проблемы. )
277
10 ноября 2011 года
arrjj
1.7K / / 26.01.2011
Чегойто? Пишем полученый пид в /var/run/blabla при следующем старте - читаем и проверяем есть ли такой процесс :D
240
10 ноября 2011 года
aks
2.5K / / 14.07.2006
Ну во первых слать процессу девятый сигнал без крайней необходимости - плохо.

А во вторых:
Цитата: arrjj
Пишем полученый пид в /var/run/blabla при следующем старте - читаем и проверяем есть ли такой процесс :D


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

277
10 ноября 2011 года
arrjj
1.7K / / 26.01.2011
Цитата: aks
Ну во первых слать процессу девятый сигнал без крайней необходимости - плохо.


Дык этож я для примера.

Цитата: aks

это и есть пример pid файла обсуждаемого на пердыдущей странице.


Ну так я для этого и написал

Цитата:

Вот если бы ты сказал как узнать именно PID самого скрипта, (который /home/admin/www/cron.php) вот это было бы здорово.


Цитата: aks
Только как видите из скрипта есть куда более наглядные способы получить PID. )


Имхо вообще бредовая идея запускать php скрипт, который запускает приложения. Проще всё из sh сделать.

14
10 ноября 2011 года
Phodopus
3.3K / / 19.06.2008
Цитата: arrjj

Имхо вообще бредовая идея запускать php скрипт, который запускает приложения. Проще всё из sh сделать.


+100501

240
11 ноября 2011 года
aks
2.5K / / 14.07.2006
Цитата: arrjj

Имхо вообще бредовая идея запускать php скрипт, который запускает приложения. Проще всё из sh сделать.


Ну это другой вопрос. Мы же от задачи пляшем. php скрипт уже есть и там может логики понаварочено, которую еще переписывать надо. =)
А если он просто в качестве запускалки процессов работает - тогда да.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог