.. image:: https://raw.githubusercontent.com/jgorset/django-kronos/master/docs/banner.png
.. image:: https://coveralls.io/repos/github/jgorset/django-kronos/badge.svg?branch=master
:target: https://coveralls.io/github/jgorset/django-kronos?branch=master
.. image:: https://travis-ci.org/jgorset/django-kronos.svg?branch=master
:target: https://travis-ci.org/jgorset/django-kronos
.. image:: https://img.shields.io/github/license/jgorset/django-kronos.svg
:target: https://raw.githubusercontent.com/jgorset/django-kronos/master/LICENSE
.. image:: https://img.shields.io/pypi/v/django-kronos.svg
:target: https://pypi.python.org/pypi/django-kronos/
Usage
Define tasks
^^^^^^^^^^^^
Kronos collects tasks from cron
modules in your project root and each of your applications::
# app/cron.py
import kronos
import random
@kronos.register('0 0 * * *')
def complain():
complaints = [
"I forgot to migrate our applications's cron jobs to our new server! Darn!",
"I'm out of complaints! Damnit!"
]
print random.choice(complaints)
Kronos works with Django management commands, too::
# app/management/commands/task.py
from django.core.management.base import BaseCommand
import kronos
@kronos.register('0 0 * * *')
class Command(BaseCommand):
def handle(self, *args, **options):
print('Hello, world!')
If your management command accepts arguments, just pass them in the decorator::
# app/management/commands/task.py
from django.core.management.base import BaseCommand
import kronos
@kronos.register('0 0 * * *', args={'-l': 'nb'})
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument(
'-l', '--language',
dest='language',
type=str,
default='en',
)
def handle(self, *args, **options):
if options['language'] == 'en':
print('Hello, world!')
if options['language'] == 'nb':
print('Hei, verden!')
Run tasks manually
^^^^^^^^^^^^^^^^^^
::
$ python manage.py runtask complain
I forgot to migrate our applications's cron jobs to our new server! Darn!
Keep in mind that if the registered task is a django command you have to run it
in the normal way::
$ python manage.py task
List all registered tasks
^^^^^^^^^^^^^^^^^^
::
$ python manage.py showtasks
* List of tasks registered in Kronos *
>> Kronos tasks
>> my_task_one
>> my_task_two
>> Django tasks
>> my_django_task
Register tasks with cron
^^^^^^^^^^^^^^^^^^^^^^^^
::
$ python manage.py installtasks
Installed 1 task.
You can review the crontab with a crontab -l
command::
$ crontab -l
0 0 * * * /usr/bin/python /path/to/manage.py runtask complain --settings=myprpoject.settings $KRONOS_BREAD_CRUMB
0 0 * * * /usr/bin/python /path/to/manage.py task --settings=myprpoject.settings $KRONOS_BREAD_CRUMB
Usually this line will work pretty well for you, but there can be some rare
cases when it requires modification. You can achieve it with a number of
settings variables used by kronos:
KRONOS_PYTHON
Python interpreter to build a crontab line (defaults to the interpreter you used to
invoke the management command).
KRONOS_MANAGE
Management command to build a crontab line (defaults to manage.py
in the current
working directory).
KRONOS_PYTHONPATH
Extra path which will be added as a --pythonpath
option to the management command.
KRONOS_POSTFIX
Extra string added at the end of the command. For dirty thinks like > /dev/null 2>&1
KRONOS_PREFIX
Extra string added at the beginning of the command. For dirty thinks like source /path/to/env &&
.
If you use the virtualenv
, you can add the environment path by echo "KRONOS_PREFIX = 'source `echo $VIRTUAL_ENV`/bin/activate && '" >> myprpoject/settings.py
Define these variables in your settings.py
file if you wish to alter crontab lines.
The env variable $KRONOS_BREAD_CRUMB
is defined to detect which tasks have to be deleted after
being installed.
Installation
::
$ pip install django-kronos
... and add kronos
to INSTALLED_APPS
.
Contribute
- Fork the repository.
- Do your thing.
- Open a pull request.
- Receive cake.
I love you
Johannes Gorset made this. You should tweet me <http://twitter.com/jgorset>
_ if you can't get it
to work. In fact, you should tweet me anyway.
1.0.0
+++++
0.9.0
+++++
- Fixed a bug that caused Kronos to crash if the settings module resided outside
of the project directory.
- Fixed a bug that caused Kronos to remove other crontabs upon uninstalling.
0.8.0
+++++
- Kronos is now even more compatible with Python 3.
- Kronos is no longer compatible with Python 2.6.
- Kronos is no longer compatible with Django 1.7.
- You may now prefix commands with
KRONOS_PREFIX
. - Fixed an issue where Kronos would not pick up on AppConfig apps.
0.7.0
+++++
- You may now pass arguments to Django management commands registered with Kronos.
- Kronos is now compatible with Python 3.
- Kronos will now log errors when it fails to load tasks.
0.6.0
+++++
- You may now register Django management commands.
0.5.0
+++++
- You may now list commands with
python manage.py showtasks
.
0.4.0
+++++
- You may now postfix commands with
KRONOS_POSTFIX
.
0.3.0
+++++
- You may now customize the interpreter, management path and python path for tasks with the
KRONOS_PYTHON
,
KRONOS_MANAGE
and KRONOS_PYTHONPATH
settings, respectively.
0.2.3
+++++
- Kronos now supports Django 1.4-style projects.
- Fixed a bug that caused installation to fail for users that didn't already have a crontab.
0.2.2
+++++
- Fixed a bug that caused unclosed single quotes in the crontab to raise a ValueError
0.2.1
+++++
- Fixed a bug that caused 'cron'-modules in the project root to be ignored.
0.2.0
+++++
- Kronos will now collect tasks from a 'cron' module in the project root.