在 azure 上的 Linux Web 应用程序上找不到 Crontab 命令,我正在尝试为 Laravel 应用程序安排一个 cronjob。
我正在尝试为我的 laravel web 应用程序运行一个 cronjob。在线解决方案建议我使用 webjobs 来实现此目的,在我的情况下它是模糊的,技术人员告诉我这是因为它是一个Linux Web 应用程序,然后我必须使用 crontab 运行 cronjobs。我这样做了,但偶尔我会得到“-bash crontab:找不到命令”,这表明整个配置以某种方式丢失了。
当我们通过 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. 我们必须重新启动应用程序才能加载启动脚本。
创建启动脚本,例如
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 中:
注意:这种方法有两个陷阱:
chmod 755 start.sh
安装,要么使用 git 命令(请参阅 SO)。您需要创建一个 bash 脚本,其中包含您要运行的所有命令。然后您在配置中将其称为启动脚本。
应该有效
或者,您可以使用 Azure 应用服务的多容器功能,并将“CRON”部分部署在第二个容器中。确保在第二个容器中包含所有必要的组件(cron 和应用程序)。
有关多容器应用程序的示例,请参阅 Microsoft 的 教程:在 Web App for Containers 中创建多容器(预览)应用程序。
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
Azure 功能的计时器触发器 功能。
创建
/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 &