2016-07-27 31 views
1

Ich habe einen Service in Python geschrieben 2.7 und verwaltet von supervisord auf eine Ubuntu 16.04 EC2 Spot Instanz.EC2, 16.04, Systemd, Supervisord & Python

Beim Systemstart Ich habe eine Reihe von systemd Aufgaben, die stattfinden müssen und fertig vor Start supervisord den Service.

Wenn die Instanz über zur Abschaltung ist, muss ich supervisord das Ereignis erfassen und sagen, die Service anmutig stoppen zu. Der Dienst muss die Verarbeitung stoppen und alle Workloads in die Warteschlange zurückgeben, bevor er ordnungsgemäß beendet wird.

  1. Was wäre der optimale Weg, um den Systemstart in diesem Szenario zu verwalten?
  2. Was wäre die optimale Methode zur Systemabschaltung in diesem Szenario?
  3. Wie handhabe ich am besten die Interaktion zwischen supervisord und service?

Antwort

1

Zuerst müssen wir eine systemd Aufgabe installieren, die wir vor dem Supervisor Anfahren ausgeführt werden soll. Lassen Sie uns ein Skript erstellen, /usr/bin/pre-supervisor.sh, das die Ausführung dieser Arbeit für uns übernimmt und das /lib/systemd/system/pre-supervisor.service für systemd erstellt.

[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 

Wie Sie sehen können, dies wird ausgeführt, nachdem die EC2 Cloud-init.service abgeschlossen ist, und vor dem supervisor.service.

Als nächstes wollen wir die /lib/systemd/system/supervisor.service ändern Nach den pres-supervisor.service abgeschlossen ist, statt nach network.target laufen.

[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 

Das, dass unsere Pre-Supervisor Aufgaben laufen vor dem Supervisor Inbetriebnahme gewährleisten.

Da diese Stelle Instanzen sind, AWS die Kündigung in der Meta-Daten-URL ausgesetzt hat, habe ich einfach benötigen, wie etwas zu injizieren:

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

in meinen Python-Service, haben sie alle fünf Sekunden überprüfen oder Also, und ordnungsgemäß beendet, sobald die Kündigung erscheint.