如何在 azure linux 托管的 Web 应用程序上运行 cronjobs?

问题描述 投票:0回答:7

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

我正在尝试为我的 laravel web 应用程序运行一个 cronjob。在线解决方案建议我使用 webjobs 来实现此目的,在我的情况下它是模糊的,技术人员告诉我这是因为它是一个Linux Web 应用程序,然后我必须使用 crontab 运行 cronjobs。我这样做了,但偶尔我会得到“-bash crontab:找不到命令”,这表明整个配置以某种方式丢失了。

azure cron
7个回答
6
投票

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

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

因此,在这种情况下,一个可能的解决方案是在应用程序启动时启动一个脚本,以便在每次重新启动后安装 cron 服务,并创建执行 Laravel 调度程序任务所需的工作。我将解释在 Azure Linux Web 应用程序上托管的 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. 我们必须重新启动应用程序才能加载启动脚本。


5
投票

创建启动脚本,例如

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. 该脚本必须是可执行的,因此要么使用 unix 和
    chmod 755 start.sh
    安装,要么使用 git 命令(请参阅 SO)。
  2. 每次启动时都会安装 3pp(此处为 crontab),因此在启动 Web 应用程序时您依赖于外部服务器/存储库。

2
投票

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

应该有效


1
投票

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

有关多容器应用程序的示例,请参阅 Microsoft 的 教程:在 Web App for Containers 中创建多容器(预览)应用程序。


0
投票
您可以考虑在 Linux 上使用函数:

https://learn.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

您可以将 Web 应用程序用于带有 docker 自定义映像的容器以及您的

Cron Jobs。此外,如果您为容器的 Web 应用程序启用 AlwaysOn,alwaysOn pinger 将使容器保持运行。

此外,根据您的要求,您可以考虑使用 Azure 应用服务 Windows 容器(预览版),并且在 Windows 容器内您可以运行自定义软件,例如 WebJobs 运行时。您可以在此处按照快速入门在应用服务中运行 Windows 容器:

https://learn.microsoft.com/en-us/azure/app-service/app-service-web-get-started-windows-container


0
投票
根据 @Ajaykumar-MSFT 建议,如果您的目标是按计划运行任务,您可以使用

Azure 功能的计时器触发器 功能。


0
投票
该解决方案不像安装 cron 那样灵活,但不需要安装额外的软件。

创建

/home/startup.sh

,然后将其设置为网络应用程序的启动命令。

#!/bin/sh ( flock -n 9 | exit 0 while true; do echo "$(date -Iseconds) Starting cron.php" >> /home/startup.log php /home/site/wwwroot/cron.php sleep 10m done ) 9>/home/site/locks/cron.php.lock &

    如果您不想记录,请删除“echo”行。
  • 调整“php”行,使其执行您的任务
  • 通过调整睡眠延迟来更改任务运行的频率
© www.soinside.com 2019 - 2024. All rights reserved.