Ich verwende Upstart-Instanzjobs, um einige meiner Dienste zu starten. Die Jobs sollen eine Instanz pro Benutzer haben, d. h. sie verwenden den Benutzernamen als Instanzparameter. Ich habe sie auch so konfiguriert, dass sie von Upstart neu gestartet werden. Das Neustarten funktioniert. So sieht meine Konfigurationsdatei aus
start on runlevel [2345]
stop on runlevel [06]
normal exit 0
respawn
respawn limit 5 300
instance $user
chdir /home/talha/syncservice/
script
exec python sync.py $user
end script
Das Problem ist, dass ich möchte, dass diese Instanzjobs beim Systemneustart neu gestartet werden. Offensichtlich kann ich beim Neustart nicht alle Benutzernamen als Instanzparameter übergeben, da ich nicht weiß, welche und wie viele Instanzen beim letzten Mal erstellt wurden.
Gibt es eine Möglichkeit, dass Upstart seine Statustabellen für Instanzjobs über Neustarts hinweg beibehalten kann? Warum gehe ich davon aus, dass es eine „Statustabelle“ gibt? Weil ich davon ausgehe, dass Upstart alle laufenden Instanzjobs verfolgt. Es würde eine Statustabelle geben, die verfolgt, welche Instanz nach einem Absturz neu gestartet werden soll. Andernfalls könnte ein Instanzjob nicht neu gestartet werden. Wenn diese Tabellen also über Neustarts hinweg persistent gemacht werden können, ist mein Problem gelöst.
Kann die Persistenz irgendwie erreicht werden? Wo speichert Upstart den Überblick über seine laufenden Jobs? Nur im Speicher oder in einer Datei?
Wenn das nicht möglich ist, bedeutet das, dass die Strophe
start on runlevel[2345]
hat weder Bedeutung noch Nutzen, zum Beispiel für Arbeitsplätze.
Antwort1
Sie können die Liste der Benutzer in einer Datei speichern (in diesem Beispiel user-sync.list). Um die Benutzerskripte wiederherzustellen, können Sie eine For-Schleife in einem Bash-Skript verwenden, das beim Booten von Root ausgeführt wird. Ihr Init-Skript heißt dabei user-sync:
#!/bin/sh
# /root/restore-user-sync.sh
for user in `cat user-sync.list`; do start user-sync user=$user; done
Fügen Sie das als Root zu crontab hinzu:
$ crontab -e
In der Cron-Datei:
@reboot /root/restore-user-sync.sh
Die Pflege der Liste der aktiven Benutzer ist der aufwändigste Teil. Sie können das vom Python-Skript erledigen lassen oder es als Teil des Upstart-Skripts ausführen:
# /etc/init/user-sync.conf
start on runlevel [2345]
stop on runlevel [06]
normal exit 0
respawn
respawn limit 5 300
instance $user
chdir /home/talha/syncservice/
pre-start script
# if $user doesn't already exist in list, add $user to list
if ! grep $user user-sync.list; then echo $user >> user-sync.list; fi
end script
script
exec python sync.py $user
end script
pre-stop script
# remove line(s) from list that exactly match $user
sed -i "/\b$user\b/d" user-sync.list
end script
Möglicherweise können Sie $user durch $USER ersetzen (das automatisch als aktueller Benutzername definiert wird). Andernfalls müssen Sie beim Aufruf des Upstart-Skripts den Benutzernamen als Parameter übergeben:
sudo start user-sync user=myusername
Antwort2
Ich würde definitiv davon abraten, dem Emporkömmling auf die Spur zu kommen. Sie können das auch anders machen.
DerAbschnitt des Kochbuchs zur Instanzstrophehat einige Beispiele, wie man so etwas macht. Ich mache so etwas mit mehreren PostgreSQL-Instanzen; sieheDasAntwort.
Die Grundidee besteht darin, einen sogenannten „Pony Engine“-Job zu erstellen, der alle Ihre Instanzjobs startet. In Ihrem Fall könnten Sie ihn durch die Unterverzeichnisse von iterieren lassen /home
oder eine separate Konfigurationsdatei führen, die die Benutzer auflistet, für die der Dienst ausgeführt werden soll. Starten Sie für jeden Benutzer eine sync.py-Instanz.
Sie haben Recht, dass der start on
/ stop on
im Instanzjob nutzlos ist. Verschieben Sie ihn in den „Pony Engine“-Job.
Leider habe ich momentan keinen Zugriff auf eine Linux-Box, aber in der oben genannten Antwort finden Sie Beispiele.