Daemon-Dienst, der eine Reihe von Prozessen ausführt (ausgewogene Verteilung)

Daemon-Dienst, der eine Reihe von Prozessen ausführt (ausgewogene Verteilung)

Ich habe das folgende Problem. Ich habe einen maschinellen Lernprozess, der im Hintergrund läuft. Noch besser, ich habe viele (sagen wir 5), die ich ausführen möchte. Jeder von ihnen verbraucht CPU- und GPU-Leistung und ich möchte daher immer nur einen von ihnen für einen bestimmten Zeitraum ausführen (z. B. 1 Stunde, tatsächlich kann das Skript selbst nach 1 Stunde geschlossen werden), ihn dann stoppen und einen anderen ausführen. Auf diese Weise kann ich sie alle trainieren, während die Maschine mehrere Tage lang gleichzeitig läuft.

Die Herausforderung besteht darin, dass ich sie ausgewogen/rotiert ausführen möchte. Anstatt den ersten auszuführen, dann den zweiten, den dritten usw. möchte ich, dass das Skript/der Handler sicherstellt, dass nach der Ausführung des ersten und dem Neustart der Maschine (oder dem Neustart des Upstart-Dienstes oder etwas Ähnlichem) der zweite ausgeführt wird. Ich möchte vermeiden, dass nach jedem Neustart derselbe Prozess gestartet wird und die meiste Zeit für den ersten und die geringste für den letzten aufgewendet wird.

Kann mir jemand eine sofort einsatzbereite Lösung vorschlagen (abgesehen davon, dass ich mein eigenes Skript/meinen eigenen Handler schreibe, was natürlich einfach ist, aber ich hätte gern etwas gründlich Getestetes statt etwas Eigenes, das ich verwalten muss).

Antwort1

Es hängt davon ab, wie robust Sie dies haben möchten. Eine einfache Lösung, die das „nächste“ Programm in einer zirkulären Liste ausführt, könnte folgendermaßen aussehen:

#! /usr/bin/env bash

programs=(program1 program2 program3 program4 program5)
state=$HOME/.${0#*/}_state

if [ -f "$state" ]; then
    read idx <"$state"
    if expr "$idx" : '[0-9][0-9]*$' >/dev/null; then
        let idx=(idx+1)%${#programs[@]}
    else
        let idx=0
    fi
else
    let idx=0
fi
printf '%d\n' "$idx" >"$state" || exit 1

exec "${programs[$idx]}" "$@"

Wenn Sie etwas Robusteres möchten, benötigen Sie eine Sperre und müssen den Status wahrscheinlich in einer Datenbank speichern.

verwandte Informationen