come faccio a chiamare uno script python da crontab che richiede l'uso di activate (source env/bin/active)?Chiamare lo script python da crontab con l'attivazione
risposta
Lo script di attivazione di virtualenv è piuttosto semplice. Imposta principalmente il percorso dell'interprete Python di virtualenv; le altre cose che fa (impostando PS1
, salvando le vecchie variabili, ecc.) non sono realmente necessarie se non ci si trova in una shell interattiva. Quindi il modo più semplice è solo per lanciare il vostro script Python con la giusta interprete Python, che può essere fatto in due modi:
1. Configurare il proprio script Python per usare Python interprete del virtualenv
supponendo interprete del vostro virtualenv è ~/virtualenv/bin/python
, si può mettere quel percorso nella parte superiore dello script Python:
#!/home/user/virtualenv/bin/python
e poi lanciare lo script dal vostro crontab, come di consueto.
2. Avviare lo script con il corretto interprete Python nel vostro cronjob
Supponendo che lo script è in ~/bin/cronjob
e Python interprete del vostro virtualenv è ~/virtualenv/python
, si potrebbe mettere questo nel vostro crontab:
* * * * * /home/user/virtualenv/python /home/user/bin/crontab
Il mio approccio è sempre quello di mantenere crontab il più semplice possibile e trattare tutte le configurazioni all'interno degli script chiamati da crontab.
1) Creare uno script di shell: per esempio /var/webapp/cron.sh
#!/bin/sh
PATH="/var/webapp/.env/bin:$PATH"
export PATH
cd /var/webapp/
python test.py
dove /var/webapp/.env/bin è la posizione virtualenv. Impostazione PATH, non è necessario eseguire l'origine ../activate
2) Impostare correttamente l'ambiente. Ad esempio, per un'applicazione di Django:
#!/usr/bin/env python
import os
from datetime import datetime
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings.production'
os.environ['DJANGO_CONF'] = 'settings.production'
from util.models import Schedule
dset = Schedule.objects.all()
for rec in dset:
print rec
print 'cron executed %s' % datetime.today()
In questo esempio, le impostazioni di Django si trovano sulle impostazioni/production.py
3) Infine, modificare/etc/crontab. Ad esempio, per essere eseguire ogni mezz'ora, tutti i giorni:
1,31 * * * * root /var/webapp/cron.sh >> /var/webapp/cron.log
Si noti che è importante per generare registri per aiutarvi a trovare errori o messaggi di debug.
E i percorsi per le librerie easy_install? – Timmy
Se sono installati anche nell'ambiente virtuale, o nella directory "globale" dei pacchetti del sito, dovrebbero essere trovati; altrimenti, dovrai metterli nel tuo '$ PYTHONPATH', che diventa un po 'più brutto, ma può essere ottenuto lanciando il cestino di Python con'/usr/bin/env' o somesuch. – mipadi
l'ultimo blocco di codice dovrebbe probabilmente terminare con "/ home/bin/cronjob" –