Script zum umschalten zwischen 2 Programmen

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. :slight_smile:

Wenn jetzt jemand hier rummeckert wegen Stromkosten :
der Rechner läuft über eine PV-Anlage,
der kann soviel Strom ziehen, wie er will.

Hallo @KTM2k22 :wink:

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. :clown_face:

1 Like

Hallo @megavolt

Erstmal Danke für deine Hilfe ! :slight_smile: :+1:

Das funktioniert so leider nicht.

Wenn ich jetzt z.b.

sudo systemctl edit boinc-client.service

in den Editor lade, sieht das so aus :

  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.

Versuchs mal so:

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.

Hallo @megavolt

Jetzt schaltet er um, Vielen Dank !

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.

Ja, das ist richtig, da das Skript funktioniert und der Service wechselt.

Mir erschließt sich die Sinnhaftigkeit nicht, denn man kann es ganz leicht prüfen:

systemctl list-units boinc-client.service foldingathome.service

oder

systemctl list-units --type=service --state=active
systemctl list-units --type=service --state=inactive
systemctl list-units --type=service --state=failed