繁体   English   中英

crontab 正在调度作业但不执行

[英]Crontab is scheduling jobs but not executing

我目前正在制作一个 GUI 应用程序,它有时要求用户输入他们的 email 和未来日期。 然后,我设置了一个 cronjob,通过电子邮件向用户发送关于该未来日期的提醒。 项目的目录和文件看起来像这样。

|--GUI_application
    |--email_sender
    |   |--__init__.py
    |   |--email.env
    |   |--send_email.py
    |--venv
        |--interface.py

send_email.py 文件包含一个名为 send_email 的 function,我已将其导入到 interface.py 文件中。 我已将 send_email function 绑定到 interface.py 文件中的 Tkinter 小部件。 我将在下面包含 send_email.py 文件(不包括导入)。

def send_email(recipient, subject, body):

  path = "/path/to/GUI_application/email_sender/email.env"
  
  load_dotenv(path)

  SENDER = os.environ.get("GMAIL_USER")
  PASSWORD = os.environ.get("GMAIL_PASSWORD")

  message = EmailMessage()
  message.set_content(body)
  message["Subject"] = subject
  message["From"] = SENDER
  message["To"] = recipient
  server = smtplib.SMTP_SSL("smtp.gmail.com", 465)
  server.login(SENDER, PASSWORD)
  server.send_message(message)
  server.quit()


 if __name__ == '__main__':
    if not len(sys.argv) == 4:
      raise Exception('Invalid number of arguments')
    sys.exit(send_email(*sys.argv[1:]))

在 interface.py 文件中,我将 send_email function 包含在名为 set_reminder 的 function 中,它绑定到 Tkinter 小部件(提醒按钮)'set 同样,我将在下面包含它的外观。

    def set_reminder(self, year, month, day, email):

      year = int(year.get())
      month = int(month.get())
      day = int(day.get())
      email = email.get()

      cron = CronTab(user='username')
      email_subject = self.construct_email_subject()
      email_body = self.construct_email_body()
      cron_comment = self.names_of_projects[self.index_of_finished_project] + '_reminder'

      job = cron.new(comment=cron_comment, command=f"python3 /path/to/GUI_application/"
                                                   f"email_sender/emailbot.py '{email}' "
                                                   f"'{email_subject}' '{email_body}'")


      job.setall(datetime(year, month, day, 09, 00, 00, 000000))


      cron.write()

当我加载应用程序并单击“设置提醒”按钮时——从而执行 set_reminder function——我注意到该作业已安排好(如果我键入“crontab -l”,我可以在 macOS 终端中查看它)。 尽管如此,email 并未发送。

我注意到,在加载 macOS 终端时,我被告知“你有邮件”。 当我加载邮件时,我看到了由 send_email function 构建的 email。 我只是想知道是否有人能够解释为什么 email 没有发送到正确的 email 地址?

谷歌搜索后,看起来人们最常见的问题是 cron 找不到他们的环境变量,尽管我不确定这里是否是这种情况,因为当我查看 macOS 终端中安排的作业时,我可以看到环境变量。

提前非常感谢。

Apple 弃用了 cron来支持由 launchd 进程控制的 Launch Agents。

注意:虽然它仍然受支持,但 cron 不是推荐的解决方案。 它已被弃用,取而代之的是 launchd。

您可以使用 launchd 创建定时作业,如此所述

还值得注意的是,文档指出

因为安装 cron 作业需要修改共享资源(crontab 文件),所以不应以编程方式添加 cron 作业。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM