Saya mencoba menjalankan perintah manajemen Django dari cron. Saya menggunakan virtualenv untuk menjaga proyek saya di-sandbox.
Saya telah melihat contoh di sini dan di tempat lain yang menunjukkan menjalankan perintah manajemen dari dalam virtualenv seperti:
0 3 * * * source /home/user/project/env/bin/activate && /home/user/project/manage.py command arg
Namun, meskipun syslog menunjukkan entri ketika tugas seharusnya dimulai, tugas ini tidak pernah benar-benar berjalan (file log untuk skrip kosong). Jika saya menjalankan baris secara manual dari shell, itu berfungsi seperti yang diharapkan.
Satu-satunya cara saat ini saya bisa mendapatkan perintah untuk dijalankan melalui cron, adalah dengan memecah perintah dan menempatkannya dalam skrip wrapper bash bodoh:
#!/bin/sh
source /home/user/project/env/bin/activate
cd /home/user/project/
./manage.py command arg
EDIT:
ars datang dengan kombinasi perintah yang berfungsi:
0 3 * * * cd /home/user/project && /home/user/project/env/bin/python /home/user/project/manage.py command arg
Setidaknya dalam kasus saya, menjalankan skrip aktivasi untuk virtualenv tidak melakukan apa-apa. Ini berfungsi, begitu seterusnya dengan pertunjukan.
sumber
env
danexport
semuanya dalam bungkus skrip bash yang Anda panggil dari crontab.Jawaban:
Anda harus dapat melakukan ini dengan menggunakan
python
di lingkungan virtual Anda:EDIT: Jika proyek Django Anda tidak ada di PYTHONPATH, maka Anda harus beralih ke direktori yang benar:
Anda juga dapat mencoba mencatat kegagalan dari cron:
Hal lain yang harus dicoba adalah membuat perubahan yang sama pada
manage.py
skrip Anda di bagian paling atas:sumber
~
dengan path lengkap? (Anda mungkin melakukannya, hanya memastikan ...)Menjalankan
source
dari cronfile tidak akan berfungsi sebagaimana cron menggunakan/bin/sh
sebagai shell default, yang tidak mendukungsource
. Anda perlu mengatur variabel lingkungan SHELL menjadi/bin/bash
:Sulit untuk
/var/log/syslog
mengetahui mengapa ini gagal karena tidak mencatat rincian kesalahan. Terbaik untuk alias diri Anda untuk melakukan rooting sehingga Anda dapat diemail dengan kesalahan cron. Cukup tambahkan diri Anda/etc/aliases
dan jalankansendmail -bi
.Info lebih lanjut di sini: http://codeinthehole.com/archives/43-Running-django-cronjobs-within-a-virtualenv.html
tautan di atas diubah menjadi: https://codeinthehole.com/tips/running-django-cronjobs-within-a-virtualenv/
sumber
. /path/to/virtualenv/bin/activate
postactivate
file, Anda harus melakukansource /path/to/virtualenv/bin/activate && source /path/to/virtualenv/bin/postactivate
Jangan melihat lebih jauh:
Pendekatan umum:
Keindahan tentang ini adalah Anda TIDAK perlu mengubah
SHELL
variabel untuk crontab darish
menjadibash
sumber
Satu-satunya cara yang benar untuk menjalankan pekerjaan python cron saat menggunakan virtualenv adalah dengan mengaktifkan lingkungan dan kemudian menjalankan python lingkungan untuk menjalankan kode Anda.
Salah satu cara untuk melakukannya adalah menggunakan virtualenv
activate_this
dalam skrip python Anda, lihat: http://virtualenv.readthedocs.org/en/latest/userguide.html#using-virtualenv-without-bin-pythonSolusi lain adalah menggemakan perintah lengkap termasuk mengaktifkan lingkungan dan memasukkannya ke dalam
/bin/bash
. Pertimbangkan ini untuk Anda/etc/crontab
:sumber
Alih-alih bercanda dengan shebang khusus virtualenv, cukup tambahkan
PATH
ke crontab.Dari virtualenv yang diaktifkan, jalankan tiga perintah dan skrip python ini hanya berfungsi:
Baris pertama crontab sekarang akan terlihat seperti ini:
sumber
Solusi terbaik bagi saya adalah untuk keduanya
man python
menyebutkan memodifikasi path di shell at$PYTHONPATH
atau python withsys.path
Jawaban lain menyebutkan ide untuk melakukan ini menggunakan shell. Dari python, menambahkan baris berikut ke skrip saya memungkinkan saya untuk berhasil menjalankannya langsung dari cron.
Begini tampilannya dalam sesi interaktif -
sumber
Saya ingin menambahkan ini karena saya menghabiskan beberapa waktu untuk menyelesaikan masalah dan tidak menemukan jawaban di sini untuk kombinasi penggunaan variabel dalam cron dan virtualenv. Jadi mungkin itu akan membantu seseorang.
Itu tidak berfungsi dengan baik ketika dikonfigurasi seperti
Terima kasih @davidwinterbottom , @ reed-sandberg dan @mkb untuk memberikan arah yang benar. Jawaban yang diterima benar-benar berfungsi dengan baik sampai python Anda perlu menjalankan skrip yang harus menjalankan biner python lain dari direktori venv / bin.
sumber
Ini adalah solusi yang bekerja dengan baik untuk saya.
Saya menggunakan miniconda dengan Conda versi 4.7.12 di Ubuntu 18.04.3 LTS.
Saya dapat menempatkan script di atas di dalam dan menjalankannya melalui crontab juga tanpa masalah.
sumber
sumber