Amazon EC2 - EC2, 16.04, Systemd, Supervisord, & Python



我有一个服务,用python 2.7编写,由supervisordUbuntu 16.04 EC2点实例上管理。

在系统启动时,我有许多systemd任务需要在主管启动服务之前完成。

当实例即将关闭时,我需要supervisord捕获事件并告诉服务正常停止。服务需要停止处理并将任何工作负载返回到队列,然后才能正常退出。

  1. 在这种情况下,管理系统启动的最佳方式是什么
  2. 在这种情况下,管理系统关闭的最佳方式是什么
  3. 如何最好地处理supervisord服务之间的交互

首先,我们需要安装一个systemd任务,我们希望在启动supervisor之前运行该任务。让我们创建一个脚本/usr/bin/pre-supervisor.sh,它将为我们处理执行该工作,并为systemd创建/lib/systemd/system/pre-supervisor.service

[Unit]
Description=Task to run prior to supervisor Starting up
After=cloud-init.service
Before=supervisor.service
Requires=cloud-init.service
[Service]
Type=oneshot
WorkingDirectory=/usr/bin
ExecStart=/usr/bin/pre-supervisor.sh
RemainAfterExit=no
TimeoutSec=90
User=ubuntu
# Output needs to appear in instance console output
StandardOutput=journal+console
[Install]
WantedBy=multi-user.target

正如您所看到的,这将在ec2cloudinit.service完成之后,在supervisor.service.之前运行

接下来,让我们修改/lib/systemd/system/supervisor.service,使其在pres supervisor.service完成后运行,而不是在network.target.之后运行

[Unit]
Description=Supervisor process control system for UNIX
Documentation=http://supervisord.org
After=pre-supervisor.service
[Service]
ExecStart=/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl -c /etc/supervisor/supervisord.conf $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=50s
[Install]
WantedBy=multi-user.target

这将确保我们的预主管任务在主管启动之前运行。

因为这些都是点实例,AWS已经在元数据url中暴露了终止通知,我只需要注入一些东西,比如:

if requests.get("http://169.254.169.254/latest/meta-data/spot/termination-time").status_code == 200

在我的python服务中,每隔五秒钟左右检查一次,并在出现终止通知时立即正常关闭。

最新更新