我有一個應該在特定時間每天運行的django腳本。我正在嘗試使用crontab
來實現此目的。腳本應該轉儲數據庫,使用gzip
進行歸檔並將其上傳到bitbucket
。Cron沒有運行django命令
以下是我crontab
文件的相關部分:
00 4 * * * root python /my_django_project_path/manage.py update_locations
47 16 * * * root python /my_django_project_path/manage.py database_bu
當我執行python /my_django_project_path/manage.py database_bu
它完美的罰款。然而,crontab或者不執行它,或者一路上發生的事情。即使是更奇怪的,第一個crontab命令(update_locations
)也可以很好地執行。
閱讀this question,我曾嘗試以下,沒有成功:
更改命令:
47 16 * * * root (cd /my_django_project_path/ && python manage.py database_bu)
更改命令:
47 16 * * * root /usr/bin/python /my_django_project_path/manage.py database_bu
添加以下以我的腳本(即使沒有它的另一個工作正常):
#!/usr/bin/python
from django.core.management import setup_environ
import settings
setup_environ(settings)
通過出口Django的項目設置的腳本運行的一切:
/my_django_project_path/cron_command_executor.sh:
export DJANGO_SETTINGS_MODULE=my_django_project.settings
python manage.py ${*}
crontab中的以下內容:
47 16 * * * root ./my_django_project_path/cron_command_executor.sh database_bu
將用戶更改爲我的用戶和Apache用戶(www-data
)。
我在我的crontab文件的最後有一個換行符。
UPDATE:
在做sudo su
,運行命令手動不再起作用。它卡住了,什麼都不做。
的tail -f /var/log/syslog
輸出是:
Mar 3 18:26:01 my-ip-address cron[726]: (system) RELOAD (/etc/crontab)
Mar 3 18:26:01 my-ip-address CRON[1184]: (root) CMD (python /my_django_project_path/manage.py database_bu)
UPDATE:
我使用下面的.netrc
文件,以防止git的要求憑據:
machine bitbucket.org
login myusername
password mypassword
的實際代碼備份腳本是:
import subprocess
import sh
import datetime
import gzip
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def handle(self, *args, **options):
execute_backup()
FILE_NAME = 'some_file_name.sql'
ARCHIVE_NAME = 'some_archive_name.gz'
REPO_NAME = 'some_repo_name'
GIT_USER = 'some_git_username' # You'll need to change this in .netrc as well.
MYSQL_USER = 'some_mysql_user'
MYSQL_PASS = 'some_mysql_pass'
DATABASE_TO_DUMP = 'SomeDatabase' # You can use --all-databases but be careful with it! It will dump everything!.
def dump_dbs_to_gzip():
# Dump arguments.
args = [
'mysqldump', '-u', MYSQL_USER, '-p%s' % (MYSQL_PASS),
'--add-drop-database',
DATABASE_TO_DUMP,
]
# Dump to file.
dump_file = open(FILE_NAME, 'w')
mysqldump_process = subprocess.Popen(args, stdout=dump_file)
retcode = mysqldump_process.wait()
dump_file.close()
if retcode > 0:
print 'Back-up error'
# Compress.
sql_file = open(FILE_NAME, 'r')
gz_file = gzip.open(ARCHIVE_NAME, 'wb')
gz_file.writelines(sql_file)
gz_file.close()
sql_file.close()
# Delete the original file.
sh.rm('-f', FILE_NAME)
def clone_repo():
# Set the repository location.
repo_origin = 'https://%[email protected]/%s/%s.git' % (GIT_USER, GIT_USER, REPO_NAME)
# Clone the repository in the /tmp folder.
sh.cd('/tmp')
sh.rm('-rf', REPO_NAME)
sh.git.clone(repo_origin)
sh.cd(REPO_NAME)
def commit_and_push():
# Commit and push.
sh.git.add('.')
sh.git.commit(m=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
sh.git.push('origin', 'master')
sh.cd('..')
sh.rm('-rf', REPO_NAME)
def execute_backup():
clone_repo()
dump_dbs_to_gzip()
commit_and_push()
if __name__ == "__main__":
execute_backup()
UPDATE:
我設法用Chris Clark's suggestion of calling the script directly rather than through manage.py修復它。但是,我仍然對造成這個問題的原因感興趣,所以賞金仍然可用。
UPDATE [解決]:
添加以下行/etc/environment
並運行它作爲我的用戶帳戶,而不是根固定它:
PWD=/my_django_project_path/helpers/management/commands
我仍然不知道爲什麼只有我的用戶可以運行如果有人有解決方案,請捐助。
你可以'tail -f/var/log/syslog'來查看是否有CRON錯誤? – jperelli
如果你爲''su'執行命令並嘗試運行它,會發生什麼? –
@jperelli,這與crontab有關:Mar 3 18:26:01 my-ip-address cron [726]:(* system *)RELOAD(/ etc/crontab) Mar 3 18:26:01 my-ip - 地址CRON [1184]:(根)CMD(python /my_django_project_path/manage.py database_bu) –