Montag, Mai 25, 2020

python-supervisord-Programm-Abhängigkeit

Habe ich [program:A], [program:B] in meinem supervisord.conf

B hängen A bedeutet:

A beginnen sollte, bevor B.

Wie gewährleisten Sie dies durch Vorgesetzte?

InformationsquelleAutor Yueyoum | 2013-07-03

4 Kommentare

  1. 23

    supervisord noch nicht direkt unterstützt, Abhängigkeiten. Ihre Optionen statt sind:

    • Verwenden Sie Prioritäten. Set priority für A auf einen niedrigen Wert, und es werde gestartet werden, bevor B und Herunterfahren nach B. Der Standardwert für priority ist 999.

      Wenn du die beiden Programme in einer Gruppe so gut, dass Sie lassen würde, starten und beenden Sie Sie im tandem mit den Prioritäten, die Regulierung Ihrer start-und stop-order.

    • Schreiben Sie eine Ereignis-listener das hört sich für PROCESS_STATE STARTING-zu-RUNNING übergang und STOPPING Veranstaltungen für A, dann weisen Sie supervisord zu starten und zu stoppen B nach diesen Veranstaltungen. Haben A autostart, aber deaktivieren Sie Autostart für B, so dass die event-handler gesteuert.

  2. 7

    Wenn Sie möchten, eine Verknüpfung, und überspringen Sie die Dokumentation Lesen, über Ereignis-Listener und überspringen, Sie ändern Ihre Programme, damit Sie verstehen, Ereignisse, dann:

    Statt beginnend Programm B (das hängt davon ab A) direkt, könnte man anfangen, ein Bash-Skript, die schläft, bis A gestartet wurde, und dann beginnt B. Zum Beispiel, wenn Sie eine PostgreSQL-Datenbank und einem server, der sollte nicht beginnen, bevor PostgreSQL:

    [program:server]
    autorestart=true
    command=/.../start-server.sh
    
    [program:postgres]
    user=postgres
    autorestart=true
    command=/usr/lib/postgresql/9.3/bin/postgres ...

    Und dann innerhalb start-server.sh:

    #!/bin/bash
    
    # Wait until PostgreSQL started and listens on port 5432.
    while [ -z "`netstat -tln | grep 5432`" ]; do
      echo 'Waiting for PostgreSQL to start ...'
      sleep 1
    done
    echo 'PostgreSQL started.'
    
    # Start server.
    echo 'Starting server...'
    /.../really-start-the-server
  3. 3

    diese ist eine großartige Lösung für mich!

    Einen workaround, den ich verwendet haben, zu setzen, ist autostart=false auf die
    Prozesse, erstellen eine bootstrap-Skript mit autostart=true und
    autorestart=false (one-shot). Die bootstrap kann ein shell-Skript
    das nennt supervisorctl start für jeden Prozess. supervisorctl start
    wird blockiert, bis ein Prozess erfolgreich gestartet wurde.

  4. 3

    Eine Lösung ist die Verwendung supervisorctl: legen Sie autostart auf false für Programm B und Programm ins Leben gerufen durch Eine, schreiben supervisorctl start B.

    Beispiel:

    supervisor.cfg:

    [supervisord]
    nodaemon=false
    pidfile=/tmp/supervisor.pid
    logfile=/logs/supervisor.log
    
    [unix_http_server]
    file=/var/run/supervisor.sock
    
    [rpcinterface:supervisor]
    supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface
    
    [supervisorctl]
    serverurl=unix:///var/run/supervisor.sock
    
    [program:A]
    command=do_a
    
    [program:B]
    command=do_b
    autostart=false

    Den do_a Programm enthält:

    #!/bin/bash
    #do things
    supervisorctl start B 

    TBH es ist die Lösung von @drrzmr aber ich Verstand nicht, dass es an der Zeit.

Kostenlose Online-Tests