我目前正在尝试在AWS Elastic Beanstalk上创建一个工作程序,该工作程序正在从特定SQS队列中提取消息(借助于Symfony Messenger的帮助)。我不想为此任务使用专用的工作人员实例。经过研究,我发现systemd可以在这里提供帮助,默认情况下,新的Amazon Linux 2实例启用了systemd。
但是,我无法创建正在运行的systemd服务。这是我的.ebextensions / 03_workers.config文件:
files:
/etc/systemd/system/my_worker.service:
mode: "000755"
owner: root
group: root
content: |
[Unit]
Description=My worker
[Service]
User=nginx
Group=nginx
Restart=always
ExecStart=/usr/bin/nohup /usr/bin/php /var/app/current/bin/console messenger:consume integration_incoming --time-limit=60
[Install]
WantedBy=multi-user.target
services:
systemd:
my_worker:
enabled: "true"
ensureRunning: "true"
如果正在运行此命令,我将看不到我的服务正在运行:
systemctl | grep my_worker
我在做什么错? :)
systemd
在Services中不受支持。唯一正确的是sysvinit
:
services:
sysvinit:
my_worker:
enabled: "true"
ensureRunning: "true"
但是我认为它甚至不起作用,因为这适用于Amazon Linux 1,而不适用于Amazon Linux 2。
在Amazon Linux 2中,您甚至不应使用太多的.ebextensions
。 AWS docs具体写为:
在Amazon Linux 2平台上,而不是在.ebextensions配置文件中提供文件和命令,我们强烈建议您使用Buildfile。 Procfile和平台挂钩在实例供应期间尽可能在环境实例上配置和运行自定义代码。
因此,您应该考虑使用Procfile,它基本上可以实现您想要实现的目标:
将Procfile用于不应退出的长时间运行的应用程序进程”。 Elastic Beanstalk希望进程从Procfile运行到连续运行。 Elastic Beanstalk监视这些进程,并重新启动任何终止的进程。对于短期运行的进程,请使用Buildfile。
替代
由于已经为/etc/systemd/system/my_worker.service
创建了单位文件systemd
,因此您可以自己enable
和start
。
为此,可以使用container_commands中的.ebextensions
。例如:
container_commands:
10_enable_worker:
command: systemctl enable worker.service
20_start_worker:
command: systemctl start worker.service