Ich will über ein Bash Script zwischen dem Folding@Home und dem BOINC Client umschalten.
Das Script starte ich dann über CRON (als root) mit
@weekly /<script pfad>/client-umschalten.sh
Die Startprogramme der Clients sind :
Bei BOINC :
/usr/bin/boinc
bzw.
systemctl start boinc-client
und
systemctl stop boinc-client
Bei F@H :
/usr/bin/FAHClient
bzw.
systemctl start foldingathome
und
systemctl stop foldingathome
Beschreibung in normal Text :
WENN BOINC läuft, DANN beende BOINC und starte F@H
SONST WENN
F@H läuft, DANN beende F@H und starte BOINC
SONST WENN
keiner der beiden clients läuft,
DANN starte /anderes script
Ich bin jetzt schon eine längere Zeit da dran,
aber bekomme das in Bash nicht Programmiert.
Bin dafür wohl zu dumm.
Wenn jetzt jemand hier rummeckert wegen Stromkosten :
der Rechner läuft über eine PV-Anlage,
der kann soviel Strom ziehen, wie er will.
Simple gesagt: Du möchtest, dass entweder BOINC oder F@H läuft, aber nicht beides gleichzeitig. Dafür gibt es Section Options, hier: Conflicts=
sudo systemctl edit boinc-client.service
Dann gibt du in vorgesehen Bereich das ein:
[Unit]
Conflicts=foldingathome.service
und speicherst es, dann:
sudo systemctl daemon-reload
Nun hast du den Service modifiziert, ohne das Original zu ändern. Die Modifizierung wird bei einem Upgrade auch nicht überschrieben.
Wenn nun foldingathome.service läuft und du boinc-client.service startest, dann wird foldingathome.service beendet und boinc-client.service gestartet.
Dasselbe machst du für foldingathome.service
Denke, um den Wechsel so einfach wie möglich zu machen, sollte in dem Skript sowas wie das stehen:
#/usr/bin/env bash
STATUS="$(systemctl is-active boinc-client.service)"
if [[ "${STATUS}" == "active" ]]; then
systemctl start foldingathome.service
fi
STATUS="$(systemctl is-active foldingathome.service)"
if [[ "${STATUS}" == "active" ]]; then
systemctl start boinc-client.service
fi
Wenn boinc läuft, dann wechselt dieser auf foldingahome und umgekehrt. Das dann einfach wöchentlich gestartet werden und da diese in Konflikt stehen, wird auch nur eines davon laufen.
Mach doch, was du willst. Auch wenn du 'nen Wasserkraftwerk zu Hause stehen hast, interessiert mich das nicht die Bohne und besonders nicht hier im Forum.
GNU nano 7.2 /etc/systemd/system/boinc-client.service.d/.#override.conf4c06c716a22f3939
### Editing /etc/systemd/system/boinc-client.service.d/override.conf
### Anything between here and the comment below will become the contents of the drop-in file
[Unit]
Conflicts=foldingathome.service
### Edits below this comment will be discarded
### /usr/lib/systemd/system/boinc-client.service
# [Unit]
# Description=Berkeley Open Infrastructure Network Computing Client
# Documentation=man:boinc(1)
# Wants=vboxdrv.service
# After=vboxdrv.service network-online.target
#
# [Service]
...
Den Parameter
[Unit]
Conflicts=foldingathome.service
habe ich siehe oben eingefügt. Keine Ahnung, ob das dort so richtig ist. Wahrscheinlich nicht.
Danach noch
sudo systemctl daemon-reload
und reboot. Das selbe mit der foldingathome.service, nur dort eben bei
Conflicts die boinc-client.service eingetragen.
Problem :
Wenn jetzt z.b. BOINC läuft, und ich die
#! /usr/bin/bash
#
# /usr/bin/client-umschalten.sh
#
# Wöchentlich über CRON Zwischen Folding@Home Client
# und BOINC Client umschalten
#
STATUS="$(systemctl is-active boinc-client.service)"
if [[ "${STATUS}" == "active" ]]; then
systemctl start foldingathome.service
fi
STATUS="$(systemctl is-active foldingathome.service)"
if [[ "${STATUS}" == "active" ]]; then
systemctl start boinc-client.service
fi
Manuell starte, wird BOINC beendet, und startet kurz danach neu. Normal müsste
er jetzt aber F@H starten. Macht er nicht. Keine Ahnung, warum.
if [[ "$(systemctl is-active boinc-client.service)" == "active" ]]; then
systemctl start foldingathome.service
elif [[ "$(systemctl is-active foldingathome.service)" == "active" ]]; then
systemctl start boinc-client.service
fi
Problem ist, dass es boinc prüft und folding startet und danach folding prüft und dann wieder bionc startet. Logikfehler meinerseits. Es muss in eine if Konstruktion oder man fügt nach dem Starten des Service ein exit 0 ein, was denselben Effekt wie eine elif Konstruktion hat.
Und das mit dem conflicts Parameter oben, das ist so richtig an der Stelle ?
Etwas bräuchte ich noch: das wenn keiner der Clients läuft, das er mir
“BOINC oder Folding@Home laufen nicht !” ins Syslog schreibt. Das hätte ich als 2. Script gemacht,
und per hourly über CRON gestartet.