Bash-Script Schleife 3600 Überschreibvorgänge zu viel?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
fee701
Beiträge: 93
Registriert: 21.07.2008 22:28:19

Bash-Script Schleife 3600 Überschreibvorgänge zu viel?

Beitrag von fee701 » 23.03.2020 21:49:19

Hallo,
ich schraube gerade ein Bash-Script zusammen, dass die Laufzeit des Computers misst und den Computer nach einer bestimmten Zeit ausschaltet - soll so eine Art Kindersicherung werden. Ich bin soweit eigentlich auch fertig, habe aber eine Frage, nämlich wie lange das meine Festplatte mitmacht. Geplant ist, sekündlich die Laufzeit des Rechners in eine Datei zu schreiben, um die Zeitzählung beim nächsten Start des Computers fortzusetzen. Die Testschleife sieht in etwa so aus:

Code: Alles auswählen

zeitv=$(cat zeitv) #    zeitv = Summe der verbrachten Zeit am Computer von vorangegangenen Sitzungen in Sekunden
echo "$zeitv"
if  [[ $zeitv -gt 11 ]]
then
	echo aus
fi

zeits=$(date +%s)
echo "$zeits"
zeita=0
echo "$zeita"

for (( var = $zeitv ; var < 12 ; (( var = var+1 )) ))
do
        sleep 1
        echo "$var"
        zeita=$(($(date +%s)-$zeits))
        echo "$zeita"
        zeitg=$(($zeitv+$zeita))
        echo "$zeitg"
        echo "$zeitg">zeitv
        if  [[ $zeitg -gt 11 ]]
        then
                echo aus 
        fi
done
Macht bei einer Stunde Laufzeit 3600 Überschreibvorgänge einer Datei... Gibt es auch eine Möglichkeit, den Wert der Abschaltzeit im Zuge des Abschaltens, Abmeldens oder Neustartens automatisch in die Datei zu schreiben? Oder wird das evtl. irgendwo sowieso in einer Logdatei des verwendeten Benutzerkontos gespeichert? Über Hinweise würde ich mich freuen :wink:
---
Debian GNU/Linux 11, Gnome 3.38.5

Benutzeravatar
MSfree
Beiträge: 10775
Registriert: 25.09.2007 19:59:30

Re: Bash-Script Schleife 3600 Überschreibvorgänge zu viel?

Beitrag von MSfree » 23.03.2020 22:55:14

Ohne jetzt die Logik überprüft zu haben:
Warum Sekunden? Minuten oder sogar 5 Minuten Intervalle reichen doch für den Zweck völlig aus.

Aber davon abgesehen, eine Festplatte kannst du im normalerweise länger als 10 Jahre im 24/7-Betrieb mit 120 Zugriffen pro Sekunden betreiben.

fee701
Beiträge: 93
Registriert: 21.07.2008 22:28:19

Re: Bash-Script Schleife 3600 Überschreibvorgänge zu viel?

Beitrag von fee701 » 24.03.2020 07:07:11

Minutentakt oder mehr hab ich auch überlegt und wird es wohl der Einfachheit halber so werden. Trotzdem noch mal die Frage, ob die Speicherung auch beim Abschaltvorgang erfolgt oder integriert werden kann?
---
Debian GNU/Linux 11, Gnome 3.38.5

Benutzeravatar
Meillo
Moderator
Beiträge: 8817
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash-Script Schleife 3600 Überschreibvorgänge zu viel?

Beitrag von Meillo » 24.03.2020 08:03:32

Du kannst Init-Scripte verwenden. Das reicht um die Zeit zu speichern. Die Pruefung kannst du per Cronjob durchfuehren. Also etwa so:

Beim Shutdown (Runlevel 0) und Reboot (Runlevel 6) kannst du ein Script aktivieren, das das beim naechsten Start noch verfuegbare Zeitguthaben in einer Datei speichert. Dazu vom bisherigen Wert in der Datei die Uptime abziehen. Das ist sie in Minuten:

Code: Alles auswählen

expr `</proc/uptime cut -d. -f1` / 60
Damit steht in der Datei das noch verfuegbare Zeitkontingent in Minuten. (Das bedeutet genau einen Schreibvorgang pro Shutdown/Reboot.)

Waehrend des Betriebs laeuft ein Cronjob (alle paar Minuten, wobei das Intervall egal ist), der den Zeitkontingent-Wert, der beim letzten Shutdown gespeichert worden ist, von der Platte liest, die aktuelle Uptime abzieht, und wenn das kleiner Null ist, einen Shutdown ausfuehrt. (Beim Shutdown wird der Wert dann ja wieder auf die Platte geschrieben. In diesem Fall Null oder ein negativer Wert. Insofern du als Admin den Wert nicht erhoehst, wird beim naechsten Start sofort wieder runtergefahren. Darum sollte das Cronjob-Intervall anfangs besser laenger sein, falls du etwas falsch eineinrichtest willst du das ja korrigieren koennen. ;-) )

Du als Admin kannst das Zeitkontingent jederzeit einsehen und beliebig erhoehen bzw. wieder auffuellen.

So wuerde ich das machen.


(Edit: Beschreibung verstaendlicher umformuliert.)
Use ed once in a while!

Benutzeravatar
MSfree
Beiträge: 10775
Registriert: 25.09.2007 19:59:30

Re: Bash-Script Schleife 3600 Überschreibvorgänge zu viel?

Beitrag von MSfree » 24.03.2020 08:25:50

Ich bin ja mal gespannt, wie lange es dauert, bis der Junior rausgefunden hat, daß man Rechner auch von einem USB-Stick booten kann, die Platte mounten kann und dann den Sperrmechanismus aushebeln kann. :mrgreen:

Benutzeravatar
Meillo
Moderator
Beiträge: 8817
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash-Script Schleife 3600 Überschreibvorgänge zu viel?

Beitrag von Meillo » 24.03.2020 09:02:46

MSfree hat geschrieben: ↑ zum Beitrag ↑
24.03.2020 08:25:50
Ich bin ja mal gespannt, wie lange es dauert, bis der Junior rausgefunden hat, daß man Rechner auch von einem USB-Stick booten kann, die Platte mounten kann und dann den Sperrmechanismus aushebeln kann. :mrgreen:
Na, wenn er das schafft, dann ist das Lehrziel doch erreicht, oder? :-D

Interessanter wird's dann wenn er auf diesem Wege fuer den Papa eine Nutzungsbeschraenkung einrichtet (inklusive geaendertem root-Passwort, deaktiviertem USB-Boot und BIOS-Passwort)! :lol: ... aber auch dann wiederum: Was will man mehr als solche Erfolgsgeschichten! :THX:

(Edit: Oder auch in beliebig anderen Geschlechtern.)
Use ed once in a while!

fee701
Beiträge: 93
Registriert: 21.07.2008 22:28:19

Re: Bash-Script Schleife 3600 Überschreibvorgänge zu viel?

Beitrag von fee701 » 24.03.2020 22:51:48

Zumindest meine erste Version, bei der der Rechner irgendwann einfach nach Vorwarnung runterfährt, war schnell durchschaut :wink:
Danke für die Tipps, muss jetzt erst mal lesen, was ich mit Init-Scripten anstellen kann, ob das auf Ebene des Benutzerkontos laufen kann bzw. die Zeit auf das Benutzerkonto umgeleitet werden kann. Läuft ein Cronjob nicht zu festen Zeiten, also unabhängig vom Abschaltzeitpunkt, bzw. den Cronjob regelmäßig prüfen lassen?
---
Debian GNU/Linux 11, Gnome 3.38.5

fee701
Beiträge: 93
Registriert: 21.07.2008 22:28:19

Re: Bash-Script Schleife 3600 Überschreibvorgänge zu viel?

Beitrag von fee701 » 25.03.2020 07:40:35

uptime speichert zwei Werte bei mir, dass erste scheinen die Sekunden zu sein, der zweite Wert verändert sich auch ständig ist aber höher. Was sagt der aus? Wird die Datei auch beständig auf der Festplatte aktualisiert?
---
Debian GNU/Linux 11, Gnome 3.38.5

Benutzeravatar
Meillo
Moderator
Beiträge: 8817
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash-Script Schleife 3600 Überschreibvorgänge zu viel?

Beitrag von Meillo » 25.03.2020 08:00:32

Dass du deine eigene Version verstaendlicher findest ist normal. Du hast sie schliesslich selber geschrieben. Sie entspricht also deiner Denkweise. Ich finde den Code beispielsweise schwer zu durchschauen, weil das eben nicht ist wie ich programmiere. Vor allem denke ich aber, dass mein Ansatz strukturell besser ist. Er kann zukuenftig, falls noetig, auch besser erweitert und skaliert werden. Aber er erfordert natuerlich auch mehr Kenntnisse des Betriebssystems.

Wie man Init-Scripte (d.h. Units) bei Systemd einrichtet, weiss ich nicht. Auch habe ich mir bisher noch gar nicht ueberlegt, wie ich das genau mit der Verbindung zum passenden eingeloggten User verknuepfen wuerde.

fee701 hat geschrieben: ↑ zum Beitrag ↑
25.03.2020 07:40:35
uptime speichert zwei Werte bei mir, dass erste scheinen die Sekunden zu sein, der zweite Wert verändert sich auch ständig ist aber höher. Was sagt der aus? Wird die Datei auch beständig auf der Festplatte aktualisiert?
Ich weiss nicht genau, was die Werte bedeuten. Das sollte sich recherchieren lassen (suche z.B. nach ``/proc/uptime'', dann wirst du schon was finden). Ich habe einfach einen davon genommen.

Das /proc-Filesystem ist keine Festplatte oder so, sondern ein Filesystem-Interface in den Kernel. Es sieht also aus wie Ordner und Dateien, aber jeder Zugriff darauf liest direkt Daten aus dem Kernel oder von anderen Programmen. Du musst dir das eher wie FIFOs oder Sockets vorstellen: Wenn man darauf zugreift, spricht man mit einem Programm, nicht mit einer Festplatte.



Ich finde deine Programmidee interessant. Gerne bin ich dabei, sie weiter zu erkunden ... oder eben konkrete technische Probleme zu loesen.
Use ed once in a while!

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Bash-Script Schleife 3600 Überschreibvorgänge zu viel?

Beitrag von JTH » 25.03.2020 08:48:20

Meillo hat geschrieben: ↑ zum Beitrag ↑
25.03.2020 08:00:32
Ich weiss nicht genau, was die Werte bedeuten. Das sollte sich recherchieren lassen (suche z.B. nach ``/proc/uptime'', dann wirst du schon was finden). Ich habe einfach einen davon genommen.
Der erste Wert ist die Uptime des Systems in Sekunden. Der zweite die Zeit, die alle CPU-Kerne zusammen im Idle verbracht haben – also eher nicht das, was ihr hier benutzen möchtet:
man proc hat geschrieben:

Code: Alles auswählen

       /proc/uptime
              This file contains two numbers (values in seconds): the uptime
              of the system (including time spent in suspend) and the amount
              of time spent in the idle process.

Es gibt bei systemd sogenannte User-Units (und damit Services). Die werden bei Anmeldung des Benutzers gestartet und bei Abmeldung gestoppt. Damit könnte man z.B. den uptime-Wert bei An- und bei Abmeldung vergleichen. Oder vllt helfen die Werkzeuge w, who oder last.
Manchmal bekannt als Just (another) Terminal Hacker.

fee701
Beiträge: 93
Registriert: 21.07.2008 22:28:19

Re: Bash-Script Schleife 3600 Überschreibvorgänge zu viel?

Beitrag von fee701 » 26.03.2020 08:38:08

@ Meillo: wollte sagen meine Kinder haben es schnell durchschaut und den Rechner einfach neu gestartet... Aber manchmal hilft ja auch reden :wink:
Also mit last, runlevel und cronjob scheint mir das irgendwie umsetzbar, dauert aber ein bißchen, bis ich gelesen und das ausprobiert habe.
---
Debian GNU/Linux 11, Gnome 3.38.5

Benutzeravatar
Meillo
Moderator
Beiträge: 8817
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash-Script Schleife 3600 Überschreibvorgänge zu viel?

Beitrag von Meillo » 26.03.2020 09:08:44

fee701 hat geschrieben: ↑ zum Beitrag ↑
26.03.2020 08:38:08
@ Meillo: wollte sagen meine Kinder haben es schnell durchschaut und den Rechner einfach neu gestartet...
;-) So lernen beide Seiten etwas ... Es ist also ein Wettstreit zwischen schnellerem Lernvermoegen und (noch) groesserem Fachwissen. :-D

Wenn du sowohl beim Shutdown als auch beim Reboot die Werte in die Datei schreibst, koennen sie das Zeitkontingent nicht erhalten oder gar wieder erhoehen. (Solange sie nicht auf die Idee kommen, einfach den Strom zu ziehen ... :roll: Ich hoffe, die Kids lesen hier nicht mit. :facepalm: :mrgreen: )
Also mit last, runlevel und cronjob scheint mir das irgendwie umsetzbar, dauert aber ein bißchen, bis ich gelesen und das ausprobiert habe.
Schritt fuer Schritt. ;-) Wir unterstuetzen dich gerne weiterhin in dem Prozess.
Use ed once in a while!

Benutzeravatar
MSfree
Beiträge: 10775
Registriert: 25.09.2007 19:59:30

Re: Bash-Script Schleife 3600 Überschreibvorgänge zu viel?

Beitrag von MSfree » 26.03.2020 09:57:11

Wenn man das bereits verbrauchte Kontingent alle paar Minuten auf die Platte schreibt, sollte das auch Reboots überleben.

Aber mal was ganz anderes:
PAM bietet doch auch Möglichkeiten, Zugänge zeitlich zu beschränken. Ein Nutzungskontingent für soundsoviele Minuten pro Tag ließe sich da schon irgendwie anflanschen. Eine Beschränkung auf bestimmte Uhrzeiten bringt PAM ja bereits mit.

Ich würde also versuchen, irgendwas über das Loginmanagement zu basteln, das ließe sich dann nicht so leicht aushebeln, uns es funktioniert auf der Konsole genauso wie beim graphischen Login. Zustandsdaten darf man allerdings nicht auf Verzeichnissen speichern, die sich typischerweise auf RAM-Disks befinden (wie /run, /tmp...). /var/lib wäre da wohl ein geeigneter Ort.

fee701
Beiträge: 93
Registriert: 21.07.2008 22:28:19

Re: Bash-Script Schleife 3600 Überschreibvorgänge zu viel?

Beitrag von fee701 » 26.03.2020 21:31:24

Hi,
ich bin jetzt so ein bißchen hin und her gerissen mit den Ideen. Aber das dauert alles, weil ich nicht viel Ahnung davon hab.
A) Also das mit auf die Festplatte schreiben ist eigentlich recht weit, und ich werde es demnächst mal posten (ist aber nix Großes). Ich habe das bash-Script einfach unter

Code: Alles auswählen

/home/[BENUTZER]/.config/autostart-scripts/
gepackt und dort wird es Benutzerspezifisch seinen Dienst tun. Im Benutzerkonto werden auch die Dateien abgelegt, ich weiß nicht ob ich denen noch automatisch eingeschränkte Rechte zuweisen kann, ist aber glaube ich auch noch nicht nötig.
B) spiele immer noch mit last und date rum und denke, das ist schon für mich die Fortgeschrittenen-Variante :lol:
C) PAM hört sich gut an, aber ist noch mal ein ganz anderer Ansatz. Will erst mal mit einem fertig werden.
---
Debian GNU/Linux 11, Gnome 3.38.5

fee701
Beiträge: 93
Registriert: 21.07.2008 22:28:19

Re: Bash-Script Schleife 3600 Überschreibvorgänge zu viel?

Beitrag von fee701 » 28.03.2020 20:36:41

So, ich glaube jetzt läuft Variante A)

Code: Alles auswählen

war noch ein Fehler drin siehe unten   
Ich weiß nicht, ob es problematisch ist, wenn man mitten in einer Schleife den shutdown Befehl gibt, aber es scheint erstmal nicht offensichtlich falsch zu laufen. Toll wäre noch ein Countdown in kdialog. Und gut wäre sicher ein Abmelden, was wohl erst über PAM realisierbar ist, damit evtl. andere angemeldete Benutzer keine Daten verlieren. Habt Ihr noch Verbesserungsvorschläge?
Zuletzt geändert von fee701 am 29.03.2020 15:53:23, insgesamt 1-mal geändert.
---
Debian GNU/Linux 11, Gnome 3.38.5

fee701
Beiträge: 93
Registriert: 21.07.2008 22:28:19

Re: Bash-Script Schleife 3600 Überschreibvorgänge zu viel?

Beitrag von fee701 » 29.03.2020 15:41:20

Also es läuft nicht, aber deswegen bin ich ja im Forum...
Zunächst für mich ein Rätsel: Manchmal speichert bei mir das script die Dateien in das gleiche Verzeichnis (/home/[BENUTZER]/.config/autostart-scripts/), manchmal in den persönlichen Ordner ((/home/[BENUTZER]/), was mir gerade die Fehlersuche erschwert. Weiß jemand, woran das liegt?
Und dann hatte ich die Variable zeitv nicht beim ersten if neu eingelesen. Ich hoffe mal jetzt läufts:

Code: Alles auswählen

#!/bin//bash

# Variablen
datumv=$(cat datumv) #    datumv = vorheriges Datum; lies letztes Datum aus Datei,
#echo "$datumv"
datuma=$(date -I) #    datuma = aktuelles Datum
#echo "$datuma"
echo "$datuma">datumv # überschreibe Datei datumv mit aktuellem Datum
zeits=$(($(date +%s)/60)) # zeits = aktuelle Zeit in Minuten seit 1970
#echo "$zeits"
zeita=0
#echo "$zeita"
#echo "$(cat zeitv)"
zeitv=$(cat zeitv) #    zeitv = Summe der verbrachten Zeit am Computer von vorangegangenen Sitzungen in Minuten
#echo "$zeitv"


# Prüfung, ob schon an diesem Tag der Rechner benutzt wurde, wenn nicht: setze Zeit auf 0 und lies die Variable neu ein
if  [[ "$datumv"  != "$datuma" ]]
then
        echo "0">zeitv
        echo "$(cat zeitv)"
        zeitv=$(cat zeitv)
fi

# Prüfung, ob an diesem Tag schon 30 Minuten verbraucht sind
if  [[ $zeitv -gt 29 ]]
then
        # Infomeldung, kdialog vorher installieren
        kdialog --msgbox "Du warst schon eine halbe Stunde am Rechner. Der Rechner geht wieder aus."  160 160&
        sleep 5 # 5 Sekunden Lesezeit
#      echo ausschon30min # Test-Aus
       sudo shutdown -h now # Abschaltung
else
# Infomeldung, kdialog vorher installieren
        zeitr=$((30-$zeitv)) # Restzeit
#       echo "$zeitr"
        kdialog --msgbox "Du darfst $zeitr Minuten den Rechner benutzen."  160 160&
# Berechnung der offenen Computerzeit
        for (( var = $zeitv ; var < 30 ; (( var = var+1 )) ))
        do
                sleep 60 # Laufzeit der Schleife in Sekunde; je Minute also 60
#               echo "$var"
                zeita=$(($(date +%s)/60-$zeits)) #    zeita = aktuell verbrachte Zeit am Computer, ändere die Variable mit jeder Minute
#               echo "$(date +%s)"
#               echo "$zeits"
#               echo "$zeita"
                zeitg=$(($zeitv+$zeita))
#               echo "$zeitg"
                echo "$zeitg">zeitv # überschreibe Datei zeitv mit Summe der verbrachten Zeit am Computer
                if  [[ $zeitg -gt 29 ]]
                then
                        # Warnungsmeldung
                        kdialog --msgbox "Die Zeit am Rechner ist leider vorbei. Speichere JETZT alles. Der Rechner geht in 20 s aus."  160 160&
                        sleep 20
#                      echo ausnach30min
                       sudo shutdown -h now # Abschaltung
                fi
        done
fi
---
Debian GNU/Linux 11, Gnome 3.38.5

Antworten