làm cách nào để gọi tập lệnh python từ crontab yêu cầu sử dụng kích hoạt (nguồn env/bin/active)?Gọi tập lệnh python từ crontab bằng cách kích hoạt
Trả lời
tập lệnh kích hoạt của virtualenv khá đơn giản. Nó chủ yếu đặt đường dẫn đến trình thông dịch Python của virtualenv của bạn; những thứ khác mà nó làm (thiết lập PS1
, lưu các biến cũ, v.v.) không thực sự cần thiết nếu bạn không ở trong một trình bao tương tác. Vì vậy, cách đơn giản nhất là chỉ để khởi động kịch bản Python của bạn với trình thông dịch Python đúng, có thể được thực hiện theo một trong hai cách sau:
1. Thiết lập kịch bản Python của bạn để sử dụng Python thông dịch viên của virtualenv bạn
giả sử thông dịch viên của virtualenv của bạn đang ở ~/virtualenv/bin/python
, bạn có thể đặt con đường mà ở phía trên cùng của kịch bản Python của bạn:
#!/home/user/virtualenv/bin/python
Và sau đó khởi động kịch bản của bạn từ crontab của bạn, như bình thường.
2. Khởi chạy kịch bản với trình thông dịch Python thích hợp trong cronjob của bạn
Giả sử kịch bản của bạn là ở ~/bin/cronjob
và Python thông dịch viên của virtualenv của bạn đang ở ~/virtualenv/python
, bạn có thể đặt điều này trong crontab của bạn:
* * * * * /home/user/virtualenv/python /home/user/bin/crontab
Cách tiếp cận của tôi là luôn giữ crontab càng đơn giản càng tốt và xử lý tất cả các cấu hình bên trong tập lệnh được gọi là crontab.
1) Tạo một kịch bản shell: ví dụ /var/webapp/cron.sh
#!/bin/sh
PATH="/var/webapp/.env/bin:$PATH"
export PATH
cd /var/webapp/
python test.py
nơi /var/webapp/.env/bin là vị trí virtualenv. Đặt PATH, bạn không cần chạy nguồn ../activate
2) Đặt đúng môi trường của bạn. Ví dụ, đối với một ứng dụng 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()
On ví dụ này, cài đặt django đang nằm trên các thiết lập/production.py
3) Cuối cùng, chỉnh sửa/etc/crontab. Ví dụ: để thực thi sau mỗi nửa giờ, mỗi ngày:
1,31 * * * * root /var/webapp/cron.sh >> /var/webapp/cron.log
Lưu ý rằng việc tạo nhật ký để giúp bạn tìm lỗi hoặc gỡ lỗi thư là rất quan trọng.
Còn các đường dẫn đến thư viện easy_install thì sao? – Timmy
Nếu chúng được cài đặt trong môi trường ảo, hoặc thư mục gói trang web "toàn cầu", chúng sẽ được tìm thấy; nếu không, bạn sẽ phải đặt chúng trong '$ PYTHONPATH' của bạn, điều này hơi xấu xí hơn nhưng có thể được thực hiện bằng cách khởi chạy thùng Python bằng'/usr/bin/env' hoặc somesuch. – mipadi
khối mã cuối cùng có thể kết thúc bằng "/ home/bin/cronjob" –