У меня есть сценарий, в котором я загружаю несколько файлов .csv с сервера sftp на свой локальный сервер linux, используя скрипт python (downloadsftp.py), после загрузки файлов я переименовываю эти файлы csv и запускаю (updatedb.py), вся эта работа cron была создана.
Я вижу, что файлы, которые я загружаю с SFTP-сервера, обновляются, но когда задание cron запускается автоматически в указанное время, оно загружает не обновленные файлы в базу данных, а старые или предыдущие файлы.
права доступа к файлам - chmod 777 для всех загружаемых файлов, что достигается с помощью другого задания cron.
Вот мои сценарии:
downloadsftp.py
filelist = server.listdir()
for filename in filelist:
filedate = re.search(".*\.csv$", filename)
if filedate:
print (filename)
server.get("/sftpfolder/" + filename, "/opt/currentdata/" + filename)
print("latest files downloaded to /opt/currentdata now proceeeding with creating backup")
server.get("/sftpfolder/" + filename, "/opt/backupdata/" + filename)
print("backup files created in /opt/backupdata")
server.remove("/sftpfolder/" + filename)
print ("cleaning files from FTP server")
print ("SFTP process completed closing FTP connection")
server.close()
print ("Bye Bye SFTP")
print ("Renaming files for updating database")
print(" ")
dir= "/opt/currentdata"
for newname in os.listdir(dir):
if(newname.split('.')[0]=='CAS1' and "J" in newname):
print newname,'BASD.csv'
shutil.move(newname, "BASD.csv")
for newname in os.listdir(dir):
if(newname.split('.')[0]=='LST' and "N" in newname):
print newname,'CVGH.csv'
shutil.move(newname, "CVGH.csv")
Dbupdate.py
def csv_to_mysql(load_sql, host, user, password):
'''
This function load a csv file to MySQL table according to
the load_sql statement.
'''
try:
con = pymysql.connect(host=host,
user=user,
password=password,
autocommit=True,
local_infile=1)
print('Connected to DB: {}'.format(host))
# Create cursor and execute Load SQL
cursor = con.cursor()
cursor.execute("truncate table mdb.data1;")
cursor.execute("truncate table mdb.data2;")
print("truncated old values from database...updating current values")
cursor.execute(load_sql)
cursor.execute(load_sql1)
print('Succuessfully updated the table from currentdata dir')
con.close()
except Exception as e:
print('Error: {}'.format(str(e)))
sys.exit(1)
# Execution Example
load_sql = """ LOAD DATA LOCAL INFILE '/opt/currentdata/BASD.csv' INTO TABLE mdb.data1\
FIELDS TERMINATED BY ';' ENCLOSED BY '"' IGNORE 1 LINES; """
load_sql1 = """ LOAD DATA LOCAL INFILE '/opt/currentdata/CVGH.csv' INTO TABLE mdb.data2\
FIELDS TERMINATED BY ';' ENCLOSED BY '"' IGNORE 1 LINES; """
host = 'xxx'
user = 'dd'
password = 'ww'
csv_to_mysql(load_sql, host, user, password)
Задания Cron:
30 21 * * * cd /opt/currentdata/ && python /opt/currentdata/downloadsftp.py >> /opt/scriptlogs/sftp.log 2>&1
33 21 * * * cd /opt/currentdata/ && python /opt/currentdata/dbupdate.py >> /opt/scriptlogs/db1all.log 2>&1
Я понятия не имею, почему обновленные файлы не помещаются в базу данных, но старые файлы могут кто-нибудь помочь здесь, чтобы понять, если есть проблема с cron или загрузкой и перемещением файла на сервере, потому что, когда я запускаю сценарий dbupdate.py вручную из каталога он корректно обновляется.