Ändern Sie die Linux-Systemzeit relativ

0

Ich brauche ein Skript, das die Systemzeit ändert x Anzahl Minuten So etwas wie:

#time = 12:56
#x = 2

if time_bool:
  time = time + x
  #time = 12:58
else:
  time = time - x
  #time = 12:54

Es ist ein Teil von Red Hat-Tests, muss aber möglicherweise auf ein anderes Betriebssystem (wahrscheinlich Fedora oder CentOS) verschoben werden.

Federer
quelle
Ich denke, das ist dir bewusst schlechte Dinge Es ist bekannt, dass dies geschieht, wenn die Zeit auf einem Unix / Linux-System rückwärts läuft.
RedGrittyBrick
Würdest du etwas dagegen tun schlechte Dinge ? Meine Erfahrung mit Linux-Systemen ist begrenzt! Mein Ziel ist es, eine Lösung zu testen, die mehrere Linux-Boxen umfasst. Eines der Skripte beinhaltet das zufällige Ändern der Zeit, um zu sehen, wie es reagiert.
Federer
2
Schlechte Dinge: Prozesse, die erwarten, dass 12:03 Uhr nach 12:00 Uhr stattfindet, Cron-Jobs, die zweimal ausgeführt werden, Programme, die etwas finden, was sie gerade getan haben, in der Zukunft bereits geschehen sind, Kinder, die ihre Eltern gefunden haben, gestorben sind, bevor sie geboren wurden Schafe, das Erwachen der Alten.
RedGrittyBrick

Antworten:

3

Du könntest es einfach tun

if $time_bool; then
    date --set="+${x} minutes"
else
    date --set="-${x} minutes"
fi

Die Datumsstringsyntax in GNU date ist ziemlich locker und erlaubt viele Dinge.

Auf Ubuntu getestet.

Daniel Andersson
quelle
0

Ein einfacher Weg könnte sein:

date --set=@$(( $(date +%s) + 120 ))

(Ungetestet)

Aber ich kann nicht garantieren, dass dies zwischen den USA funktionieren wird date +%s ist eine Erweiterung.

Das Skript versucht, das aktuelle Datum in UTC abzurufen, es in Sekunden aus der Epoche umzuwandeln, 120 Sekunden hinzuzufügen und dann das Datum aus Unix-Epoche-Sekunden festzulegen.

deed02392
quelle
Backticks können Sie nicht so verschachteln. Benutzen $( ) stattdessen und $(( )) für die Berechnung. Beachten Sie, dass --set ist auch eine GNU-Erweiterung und akzeptiert die gleichen Formate wie -d, so --set=@12345 sollte direkt funktionieren.
grawity
Gute Bearbeitung, danke dafür. Warum müssen für die Berechnung doppelte Klammern verwendet werden?
deed02392
1
weil $( und $(( sind zwei verschiedene Operatoren. $( führt einen Prozess aus $(( führt Berechnungen durch. Der Operator selbst wird da benötigt date führt selbst keine Berechnungen durch, wenn Sie ihm eine geben @timestamp.
grawity