LINUX.ORG.RU
ФорумAdmin

Альтернативы ATD?


0

1

Подумал найти какую-то замену ATD или даже написать самостоятельно аналог ATD на Perl.
Собственно, пока единственным выходом вижу использовать fcron (управление им через сокет позволяет создать задачу, которая будет включать в себя команду на удаление задачи и выполнение нужного кода), но это какой-то изврат ИМХО. Хотя, возможно,я просто не очень хорошо изучил возможности fcron'а.
Проблемы у ATD очень серьёзные и тем не менее это единственный «будильник» в Linux (источник событий таймера). Позор какой-то: делаем ракеты и покоряем Енисей, а элементарную и очень нужную вещь сделать не можем...

Кстати, кто-нибудь знает, как (на уровне системных вызовов или функций GLibC) в асинхронном режиме поставить «таймер», который разбудит процесс через N миллисекунд?

★★★★★

Последнее исправление: DRVTiny (всего исправлений: 1)

Нашёл вот такое описание функции timer_create:
http://linux.die.net/man/2/timer_create
Но, видимо, поскольку я не программист на Си или по каким-либо иным причинам, я из этого всего так и не понял, как поставить таймер, «заснуть» (заблокироваться), по срабатыванию сигнала таймера снова разблокироваться и что-то делать дальше?
Так я бы смог на каждое «задание» создавать новый процесс, который устанавливал бы себе таймер, уходил в блокированное состояние, а при срабатывании таймера/генерации сигнала - разблокировался, выполнял своё задание и завершался. Вроде бы идея очень простая, но что-то реализация таймеров в POSIX не внушает мне доверия, поправьте, если я не прав. Например, процессы действительно могут создавать отдельные таймеры, а вот трэды внутри процессов - нет. Но, простите меня, создавать под каждую новую задачу действительно именно процесс со всеми его структурами только для того, чтобы подождать события, породить ещё один процесс, который будет замещён при вызове exec, а самому завершиться - это как-то... а перебор по-моему.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от AptGet

А каким образом nanosleep делает suspend the execution of the calling thread?
Собственно хотелось бы, чтобы процесс действительно блокировался и размораживался потом ядром по событию того системного таймера, который используется для переключения процессов и потоков. За красивыми словами о suspend'е я так и не увидел ни малейших признаков асинхронности. Иначе как объяснить тот факт, что процесс всё равно реагирует на события? Насколько я понимаю, системный вызов «заблокировать процесс» предполагает его разблокирование по какому-то конкретному (одному единственному) событию?

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

Зачем усложнять простое? at позволяет запустить некую команду в определенное время. Есть конечно некие недостатки. Но я не думаю что огромной проблемой является невозможно указать дату исполнения вида 'now + 6 hours 23 minutes'

blind_oracle ★★★★★
()
Ответ на: комментарий от DRVTiny

А каким образом nanosleep делает suspend the execution of the calling thread?

Надо смотреть в ядро.

Собственно хотелось бы, чтобы процесс действительно блокировался и размораживался потом ядром по событию того системного таймера, который используется для переключения процессов и потоков.

Так и будет.

За красивыми словами о suspend'е я так и не увидел ни малейших признаков асинхронности. Иначе как объяснить тот факт, что процесс всё равно реагирует на события? Насколько я понимаю, системный вызов «заблокировать процесс» предполагает его разблокирование по какому-то конкретному (одному единственному) событию?

Нет. Как правило, все блокирующиеся системные вызовы разблокируются еще и по сигналу.

AptGet ★★★
()
Ответ на: комментарий от blind_oracle

Огромной проблемой являются две проблемы:
- дискретность не меньше минуты (ЩИТО?! да за это время на копеечном десктопном Intel Core i5-2500K можно число PI рассчитать с точностью до 10000-ного знака)
- время исполнения не гарантировано, то есть at now+1min в большинстве случаев не наступит ровно через одну минуту, может наступить раньше, может позже - это уж как повезёт... Учитывая дискретность, погрешность в +-60000 миллисекунд (немного) расстраивает.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

Ну, в таком случае ты я думаю просто утилитой ошибся. Пиши скрипт для своих задач, благо gettimeofday() никто не отменял. С точностью хоть до наносекунды. atd немного для другого.

blind_oracle ★★★★★
()
Ответ на: комментарий от blind_oracle

atd немного для другого.

Немного для чего?
На мой взгляд это шедуллер задач, который мог бы их выполнять с немного лучшей дискретностью и немного же более высокой точностью в рамках этой дискретности.. Если мне нужно запланировать выполнение через 5 секунд, считая от текущего момента, я типа должен sleep использовать? А если нельзя использовать sleep, а через 5 секунд всё-таки что-то должно случиться, мне типа забить и сделать at now+1min и уповать на то, что всё произойдёт не через 2 минуты и не вообще моментально, без всякой задержки, а всего лишь через одну минуту?

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

atd был создан для простых административных действий вроде «echo reboot | at 23:00», а не для realtime-шедулинга. Если нужно что-то точнее - перл в зубы.

blind_oracle ★★★★★
()
Ответ на: комментарий от DRVTiny

дискретность не меньше минуты

Да ладно тебе, для тех задач для которых cron/atd _нужно_ использовать, этого достаточно. А все остальное пытаться запихнуть в cron просто глупо.

fagot ★★★★★
()
Ответ на: комментарий от DRVTiny

Ну, всё зависит от задачи. Если просто, то к примеру форкаем по процессу\треду на каждый джоб, а там alarm/ualarm/sleep.

blind_oracle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.