#python #macos #cron #smtplib #launchd
#python #macos #cron #smtplib #launchd
Вопрос:
Я хочу настроить автоматическое резервное копирование для своего веб-сайта и создал для этого рабочий скрипт python. Сначала я попробовал планирование launchd
, а затем cron
и для них обоих я получил тот же результат: резервное копирование работает, но уведомление по электронной почте завершается с ошибкой.
Скрипт на 100% работает так, как задумано, при запуске из Terminal
или Sublime Text 3
, и я использую macOS Catalina версии 10.15.7.
Журнал ошибок для обоих launchd
и cron
таков:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 926, in _bootstrap_inner
self.run()
File "/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "/usr/local/lib/python3.7/site-packages/fast_email/fast_email.py", line 95, in send
server.ehlo()
File "/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/smtplib.py", line 440, in ehlo
self.putcmd(self.ehlo_msg, name or self.local_hostname)
File "/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/smtplib.py", line 367, in putcmd
self.send(str)
File "/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/smtplib.py", line 359, in send
raise SMTPServerDisconnected('please run connect() first')
smtplib.SMTPServerDisconnected: please run connect() first
Часть моего пакета fast_email, в которой возникает ошибка ( server.ehlo()
строка):
def send(msg_data, d):
server = smtplib.SMTP_SSL(d['EMAIL_SERVER'], d['EMAIL_PORT'])
server.ehlo()
server.login(d['EMAIL_SENDER'], d['EMAIL_PASSWORD'])
message = MIMEMultipart("alternative")
message["From"] = d['EMAIL_SENDER']
Если это может иметь значение, я использую threads ( threading.Thread
) в своем пакете fast_email, потому что иногда я хочу быстро отправлять электронные письма людям в моей компании.
Проблема очень неприятная, и я потратил на нее целый день в одиночку, не говоря уже о других проблемах с launchd… Пожалуйста, если у вас есть какие-либо подсказки, я буду очень благодарен.
PS моя строка задания cron:
0 9 * * * (/usr/local/bin/python3 my/script/pathname.py > /Users/my_username/Desktop/cronjob.log 2>amp;1)
и у меня есть
<key>AbandonProcessGroup</key>
<true/>
в моем файле launchd .plist .
Комментарии:
1. Некоторые серверы требуют
ehlo
повторной проверки подлинности.2. Круглые скобки в
cron
задании не добавляют ценности и стоят вам процесса.3. @tripleee Если бы это было серверной задачей, это также привело бы к сбою при запуске с терминала. И он вылетает на первом ehlo, поэтому у второго не будет возможности помочь. Спасибо за подсказку в скобках, я просто использовал то, что видел в каком-то руководстве. Почему использование круглых скобок будет стоить мне процесса?
4. Вот что делают круглые скобки; выполняйте команды в отдельной подоболочке.