【问题标题】:How to run cronjobs on an azure linux hosted webapp?如何在 azure linux 托管的 Web 应用程序上运行 cron 作业?
【发布时间】:2019-08-26 08:24:43
【问题描述】:

在 azure 上的 Linux Web 应用程序上找不到 Crontab 命令,我正在尝试为 laravel 应用程序安排 cronjob。

我正在尝试为我的 laravel 网络应用程序运行 cronjob。在线解决方案建议我为此使用 webjobs,在我的情况下它被模糊了,技术人员告诉我这是因为这是一个 Linux 网络应用程序,然后我必须使用 crontab 运行 cronjobs。我确实这样做了,但有时我会收到“-bash crontab: command not found”,这表明整个配置会以某种方式丢失。

【问题讨论】:

  • 据我了解,您想为您的网络作业设置一个时间表。如果是这样,您可以直接创建一个计划的 WebJob(docs.microsoft.com/en-us/azure/app-service/…)。
  • @test123 ,我已经完成了,但在我的特殊情况下,WebJob 设置模糊不清,主要是因为它是一个 linux webapp。

标签: azure cron


【解决方案1】:

您需要创建一个包含您要运行的所有命令的 bash 脚本。那么你在配置中将其称为启动脚本。

它应该可以工作

【讨论】:

    【解决方案2】:

    创建一个启动脚本,例如start.sh 并添加以下内容:

    # install & start crontab
    apt-get update -y
    apt-get install -y cron
    echo "* 04-17 * * * your_job.sh" | crontab -
    service cron start
    
    # don't forget to start your webapp service at the end of this script, e.g.:
    python -m gunicorn your_application:app
    

    然后将 start.sh 作为启动脚本添加到您的 WebApp:

    注意:这种方法有两个缺陷:

    1. 脚本必须是可执行的,所以要么安装 w/unix 和 chmod 755 start.sh,要么使用 git 命令(参见 SO)。
    2. 每次启动时都会安装 3pp(此处为 crontab),因此您在启动 webapp 时依赖于外部服务器/存储库。

    【讨论】:

      【解决方案3】:

      当我们通过 ssh 打开应用程序的控制台时会收到警告:

      Note: Any data outside '/ home' is not persisted
      

      因此,在这种情况下,一个可能的解决方案是在应用程序启动时启动一个脚本,以便在每次重新启动后安装 cron 服务并创建执行 Laravel 调度程序任务所需的工作。我将解释托管在 Azure Linux Webapp 上的 PHP + Laravel 应用程序的工作原理:

      1.创建启动脚本/home/startup.sh:

      apt-get update -qq && apt-get install cron -yqq
      (crontab -l 2>/dev/null; echo "* * * * * /usr/local/bin/php /home/site/wwwroot/MyAppFolder/artisan schedule:run >> /home/cronresult.txt 2>&1")|crontab
      service cron start
      

      注意:请注意,我们指出我们的 PHP PATH 位于 /usr/local/bin/php 目录中。我们会将命令的输出保存在文件 /home/cronresult.txt 中,这将有助于我们调试执行过程中出现的任何问题。

      2.在我们的天蓝色面板中将“/home/startup.sh”设置为“启动命令”,正如@HeyMan 在他的回答中所指出的那样。

      3.我们必须重新启动应用程序才能加载启动脚本。

      【讨论】:

        【解决方案4】:

        您可以考虑在 Linux 上使用 Functions:https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-first-azure-function-azure-cli-linux

        有一个关于此的反馈帖子 - https://feedback.azure.com/forums/169385-web-apps/suggestions/32437156--linux-to-support-webjob-feature-on-webapp-for-co

        您可以通过 Cron 作业 将 Web 应用程序用于具有 docker 自定义映像的容器。此外,如果您为容器的 Web 应用启用 AlwaysOn,alwaysOn pinger 将保持容器运行。

        此外,根据您的要求,您可以考虑使用 Azure 应用服务 Windows 容器(预览版),并且在 Windows 容器内,您可以运行自定义软件,例如 WebJobs 运行时。您可以在此处按照快速入门在应用服务中运行 Windows 容器:https://docs.microsoft.com/en-us/azure/app-service/app-service-web-get-started-windows-container

        【讨论】:

        • 谢谢,我会调查一下
        【解决方案5】:

        根据@Ajaykumar-MSFT 的建议,如果您的目标是按计划运行任务,您可以使用timer trigger for Azure function 功能。

        【讨论】:

          【解决方案6】:

          或者,您可以使用 Azure 应用服务的多容器功能并将“CRON”部分部署在第二个容器中。确保在第二个容器中包含所有必要的组件(cron 和应用程序)。

          有关多容器应用程序的示例,请参阅 Microsoft 的 Tutorial: Create a multi-container (preview) app in Web App for Containers

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-04-02
            • 2014-04-20
            • 2013-10-05
            • 2014-01-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多