Запуск сценария python (django) с относительным импортом в качестве демона в фоновом режиме в Ubuntu (linux) - PullRequest
0 голосов
/ 18 января 2020

Я искал вокруг и нашел множество ответов, но не смог найти ни одного подходящего.

В настоящее время я использую сервер Ubuntu для моего django веб-сайта. Путь к файлу основной папки внутри проекта: '/ var / www/mysite/main'

Внутри этого каталога находится файл tasks.py, который я хотел бы выполнять в фоновом режиме, даже при выходе из S SH терминал.

Для справки, tasks.py ниже. В настоящее время все операции импорта находятся в том же (/ main), что и tasks.py, но, если возможно, я бы хотел разместить некоторые из них в других каталогах внутри / main:

#!/usr/bin/env python

from .db_service import *
from .pricer_inventory import *
from .propdb import *
from .inventory import *
import time
import schedule
import json
import os
from threading import Thread


def write_list_info_to_db():
    print('Starting writing list info to db')
    dir_name = os.path.dirname(__file__)
    file_path = os.path.join(dir_name, 'propdb/inventory_pricing.json')

    list_response = generate_list_info(get_list_of_inventory_styles(), 30, True)

    with open(file_path, 'r') as file:
        jdata = json.load(file)
        for style in list_response.keys():
            jdata.update({style: list_response[style]})

    with open(file_path, 'w') as outfile:
        json.dump(jdata, outfile)

write_list_info_to_db()
#schedule.every().day.at('08:30').do(write_list_info_to_db)
#schedule.every(1).to(2).hours.do(write_list_info_to_db)


class SchedulerThread(Thread):
    @classmethod
    def run(cls):
        while True:
            schedule.run_pending()
            time.sleep(10)


SchedulerThread().start()

У меня также есть служба Конфигурационный файл в / lib / systemd / system / с именем 'tasks.service'

[Unit]
Description=Database Service
After=multi-user.target
Conflicts=getty@tty1.service

[Service]
Type=simple
ExecStart=/usr/bin/python3 /var/www/mysite/main/tasks.py
StandardInput=tty-force

[Install]
WantedBy=multi-user.target

Примечание. Я также попытался сохранить файл tasks.py в / usr / bin и указать там конфигурационный файл службы.

Затем я пытаюсь запустить службу из командной строки:

sudo systemctl daemon-reload
sudo systemctl enable tasks.service
sudo systemctl start tasks.service
sudo systemctl status tasks.service

Проверка состояния выдает:

● tasks.service - Database Service
   Loaded: loaded (/lib/systemd/system/tasks.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Sat 2020-01-18 18:02:33 UTC; 4s ago
  Process: 4789 ExecStart=/usr/bin/python3 /var/www/mysite/main/tasks.py (code=exited, status=1/FAILURE)
 Main PID: 4789 (code=exited, status=1/FAILURE)

Jan 18 18:02:32 localhost systemd[1]: Started Database Service.
Jan 18 18:02:33 localhost systemd[1]: tasks.service: Main process exited, code=exited, status=1/FAILURE
Jan 18 18:02:33 localhost systemd[1]: tasks.service: Failed with result 'exit-code'.

Я думаю, что часть проблемы заключается в том, что python теперь запускается за пределами папки проекта и вызывает сбой при относительном импорте. (Когда я пытаюсь запустить tasks.py через командную строку, я получаю сообщение об ошибке «Модуль не назван»)

У меня точно нет опыта запуска сценариев как демонов или ubuntu / linux в целом, поэтому если есть лучшие способы go об этом, я открыт для всего.

Спасибо всем.

...