Upstart-Instanzjob beim Systemneustart

Upstart-Instanzjob beim Systemneustart

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 /homeoder 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 onim 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.

verwandte Informationen