Crontab
Какие задачи выполняет cron помимо тех что заданы с помощью crontab -e ?
Почему спрашиваю:
Скрипт на сервере выполняется каждую минуту, берет значения из базы и выполняет долгий процесс... Нужно чтобы cron не выполнял тоже действие через минуту, если скрипт не закончил работу. Сам скрипт - на php.
Варианты с созданием файла, - отпадают, ненадежно. А если еще обработку ошибок отрабатывать (время скрипта замерять, время создания и т.д... Корочее это не подходит).
flock тоже не подходит, так как не работает в nfs.
Думаю написать приложение которое запускает этот скрипт на асме, и в след. раз проверяет не запущено ли оно уже. Т.е. просто запускать скрипт из под этого приложения:
mov ebx, shell
xor ecx, ecx
xor edx, edx
int 0x80
---------------
shell db '#!/usr/bin/php5 /home/admin/www/cron.php',0
И вначале проверять не запущено ли оно, если да то exit.
Так вот и думаю, а не убить ли просто процесс crontab да и не мучатся, но боюсь. Не повлияет ли это на работу системы...
Кто что скажет?
Думаю написать приложение которое запускает этот скрипт на асме, и в след. раз проверяет не запущено ли оно уже. Т.е. просто запускать скрипт из под этого приложения:
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 заслуживает оценки отлично за предложенное решение.
Начал писать, наткнулся на ошибку, оказалось передача параметров происходит немного по-другому, вот так правильно:
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. Чем они отличаются?
Ещё есть в самом файле можно хранить pid процесса, перед запуском проверять наличие существования процесса по pid. Если файл с pid существует, а процесса нет, то файл смело можно обновить и выполнять задачу штатным образом.
Давай представим что в php max_execution_time стоит 2 часа. На 5й минуте я перезагрузил сервер. Остальные 1:55 скрипт просто не будет запускаться. Такой простой на 2 часа мне не подходит, сори...
Что касается блокировки файла по flock - сначала он мне понравился, но не работает в nfs...
Тоже вариант, и вроде не плохой... Но все таки нацелился выполнить это программно...
Возвращаясь к моему предыдущему посту:
Ведь не может быть чтобы вот так вот по sys_execve приложению передавалось управление, и возврата уже не было.. Многие программы написаны так:
Какие-то переменные, вычисления...
exec 'что-то';
exec 'еще что-то';
Вывод результатов
Выход...
Или в стек надо сувать адрес возврата? Но ведь все равно приложение запущено не будет, а только в начале и в конце.А если до этого хранились переменные в памяти, они все стираются? Не хорошо. Или я не ту функцию использую?
Сорри за много буков но я с трудом нашел функции 0х80 прерывания, при чем все они очень скудно описаны, поэтому так много вопросов.
p.s. Еще один))):
Так что все таки будет с системой, если отрубить крон вначале выполнения скрипта, а в конце запустить его обратно? :) Я к тому что: Не выполняет ли cron каких нибудь системных критических процессов?
PHP скрипт запускает ffmpeg, qt-faststart, записывает в базы значения и т.д. .. PID какого конкретно процесса мне проверять ? php? ffmpeg? Поэтому этот вариант то и не подходит.
Да я не спорю, можно многими способами это сделать, но не все подходят именно под мои нужды.
Ну скрипт же их по очереди запускает и надо дождаться пока именно скрипт завершиться а не ффмпег? Вот pid скрипта и надо записывать.
Пара секунд поиска в гугле подсказали это: http://php.net/manual/en/function.posix-getpid.php
shPID=$!
echo $shPID
ps -Ae|grep $shPID
kill -9 $shPID
А во вторых:
это и есть пример pid файла обсуждаемого на пердыдущей странице. Только как видите из скрипта есть куда более наглядные способы получить PID. )
Дык этож я для примера.
это и есть пример pid файла обсуждаемого на пердыдущей странице.
Ну так я для этого и написал
Вот если бы ты сказал как узнать именно PID самого скрипта, (который /home/admin/www/cron.php) вот это было бы здорово.
Имхо вообще бредовая идея запускать php скрипт, который запускает приложения. Проще всё из sh сделать.
Имхо вообще бредовая идея запускать php скрипт, который запускает приложения. Проще всё из sh сделать.
+100501
Имхо вообще бредовая идея запускать php скрипт, который запускает приложения. Проще всё из sh сделать.
Ну это другой вопрос. Мы же от задачи пляшем. php скрипт уже есть и там может логики понаварочено, которую еще переписывать надо. =)
А если он просто в качестве запускалки процессов работает - тогда да.