EC2、16.04、Systemd、Supervisord,& Python
EC2, 16.04, Systemd, Supervisord, & Python
我有一个 service 用 python 2.7 编写并由 supervisord[=33= 管理] Ubuntu 16.04 EC2 spot 实例.
在系统启动时,我有一些 systemd 任务需要在 supervisord 启动 服务.
当实例即将关闭时,我需要 supervisord 来捕获事件并告诉 service 优雅地停止。在正常退出之前,该服务将需要停止处理并return任何工作负载到队列。
- 在这种情况下管理系统启动的最佳方式是什么?
- 在这种情况下管理系统关闭的最佳方法是什么?
- 如何最好地处理 supervisord 和 service 之间的交互?
首先,我们需要安装一个 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
如您所见,这将 运行 在 ec2 cloud-init.service 完成之后,supervisor.service.
接下来,让我们在pres-supervisor.service完成后,将/lib/systemd/system/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
这将确保我们的 pre-supervisor 任务 运行 在 supervisor 启动之前。
因为这些是 spot 实例,AWS 在元数据中暴露了终止通知 url,我只需要注入类似的东西:
if requests.get("http://169.254.169.254/latest/meta-data/spot/termination-time").status_code == 200
进入我的 python 服务,让它每五秒左右检查一次,并在终止通知出现时立即正常关闭。
我有一个 service 用 python 2.7 编写并由 supervisord[=33= 管理] Ubuntu 16.04 EC2 spot 实例.
在系统启动时,我有一些 systemd 任务需要在 supervisord 启动 服务.
当实例即将关闭时,我需要 supervisord 来捕获事件并告诉 service 优雅地停止。在正常退出之前,该服务将需要停止处理并return任何工作负载到队列。
- 在这种情况下管理系统启动的最佳方式是什么?
- 在这种情况下管理系统关闭的最佳方法是什么?
- 如何最好地处理 supervisord 和 service 之间的交互?
首先,我们需要安装一个 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
如您所见,这将 运行 在 ec2 cloud-init.service 完成之后,supervisor.service.
接下来,让我们在pres-supervisor.service完成后,将/lib/systemd/system/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
这将确保我们的 pre-supervisor 任务 运行 在 supervisor 启动之前。
因为这些是 spot 实例,AWS 在元数据中暴露了终止通知 url,我只需要注入类似的东西:
if requests.get("http://169.254.169.254/latest/meta-data/spot/termination-time").status_code == 200
进入我的 python 服务,让它每五秒左右检查一次,并在终止通知出现时立即正常关闭。