Forum: PC-Programmierung Rechner 1 * pro Tag aufwachen lassen um Script auszuführen


von Kalle R. (kalle96)


Lesenswert?

N'abend,

ich möchte meinen Linuxrechner gerne immer zur gleichen Zeit aus dem 
Standby aufwachen lassen und ein Pythonscript im Context des 
angemeldeten Users ausführen lassen. Sobald das Script alles erledigt 
hat, soll der Rechner wieder bis zum nächsten Aufwachen in den Standby 
wechseln. Der Rechner soll also nur 1 * pro Tag kurz etwas erledigen und 
ansonsten schlafen. Das Script funktioniert bereits in einem Terminal 
und auch das Aufwachen aus dem Standby (S4, Suspend to Disk) 
funktioniert, wenn ich es im Terminal mit sudo über rtcwake 
programmiere. Leider scheinen diverse Wege zu existieren, sowohl um ein 
Script nach dem Aufwachen zu starten, als auch um den Rechner ohne sudo 
in den Standby zu versetzen.
Ich frage mich, ob man da einfach beliebig etwas kombinieren kann und 
welcher Weg ein Pythonscript problemlos im aktuellen Usercontext starten 
kann? Ich bin mir auch unsicher, ob das Fehlen bzw. Vorhandensein eines 
root accounts bei der Auswahl eine Rolle spielt.
Es wäre schön, wenn mir jemand für 'Bullseye' eine sinnvolle 
Vorgehensweise grob erklären könnte.

Tausend dank sagt: Kalle

von Hans (Gast)


Lesenswert?

Script dauerhaft laufen lassen und auf Zeitsprung warten? Warum 
eigentlich Standby? Mit ganz aus könntest du crontab und @reboot nutzen.

von Hans (Gast)


Lesenswert?

Um den Rechner in den Standby zu schicken, würde ich sudo nutzen und den 
entsprechenden Befehl für den user ohne Passwort freigeben:
1
myuser ALL=NOPASSWD: systemctl start systemd-suspend

Mit Systemd könntest du nach dem Aufwachen das suspend.target verwenden, 
um dein Script zu starten. Den user kannst du im unit file mit 
definieren.

von wächst nach (Gast)


Lesenswert?

> orhandensein eines root accounts bei der Auswahl eine Rolle spielt.

probiers:


zum experimentieren, sowas in der Art:


systemd-run OnCalendar=*-*-* HH:MM:SS WakeSystem=true 
/usr/bin/deinskript

täglich, zur anzugebenen Zeit wach auf und ...


man systemd-run; systemd.timer WakeSystem

von wächst nach (Gast)


Lesenswert?

als user ausgeführt,
(der darf jetzt noch nicht schlafen, also was anderes zum probieren)

$systemd-run --on-active=10 /usr/bin/xmessage hello -display 0:0
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to manage system services or other units.
Authenticating as: root
Password:


sollte die Frage beantworten.
ist halt interaktiv, via unit file s.o.

von wächst nach (Gast)


Lesenswert?

So jetzt, nicht ganz sicher mit der "timer-property" sollte aber schon 
hinkommen, hoffe doch mal das gehört zu den timer-properties ...

systemd-run --on-calendar='*-*-* 10:00:00' 
--timer-property=WakeSystem=true  /usr/bin/...


Käme dann z.B. täglich um 10, nat. nur bis zum nächsten boot.
vlt. hilft es weiter, schlafen schicken aus dem skript.

von Nor (Gast)


Lesenswert?

in der /etc/crontab folgende Zeile einfügen und zum Neustart wird 
datei.sh ausgeführt.

@reboot username /pfadzumscript/datei.sh

Mehr zur crontab unter https://wiki.ubuntuusers.de/Cron/

von Rüdiger B. (rbruns)


Lesenswert?

Wegen der Stromkosten habe ich folgende Lösung:
Zeitschaltuhr
Rechner startet wenn (BIOS)
Power off wenn Script beendet
Zeitschaltuhr schaltet nach einer halben Stunde wieder aus.

von Nor (Gast)


Lesenswert?

Nor schrieb:
> in der /etc/crontab folgende Zeile einfügen und zum Neustart wird
> datei.sh ausgeführt.
>
> @reboot username /pfadzumscript/datei.sh
>
> Mehr zur crontab unter https://wiki.ubuntuusers.de/Cron/

Der taglichen Wakeup über das BIOS dürfte am einfachsten sein und dann 
beim Start obiges, dann mit sudo shutdown now wieder ausschalten.

von wächst nach (Gast)


Lesenswert?

systemd hat sich doch festgesetzt.

...
Running timer as unit: run-u382.timer
Will run service as unit: run-u382.service



und sowas ist wenigsten  bei mehreren Nutzern ganz nett:


journalctl -r|grep run-u382*
Oct 22 09:38:23 slax polkitd(authority=local)[1462]: Operator of 
unix-process:16920:172801167 successfully authenticated as 
unix-user:root to gain TEMPORARY authorization for action 
org.freedesktop.systemd1.manage-units for system-bus-name::1.401 
[systemctl stop run-u382.timer] (owned by unix-user:xals)
...



have fun

von Markus (Gast)


Lesenswert?

wahrscheinlich etwas überkandidelt für deine Zwecke:

https://github.com/languitar/autosuspend

von Kalle R. (kalle96)


Lesenswert?

Hallo,

vielen Dank für die vielen guten Ideen.
Ursprünglich wollte ich ja StandBy, aber der Vorschlag mit ganz aus und 
nur kurz über das Bios einschalten ist wirklich gut. Ich hatte diese 
Möglichkeit völlig vergessen, denn ich war schon bestimmt seit 10 Jahren 
nicht mehr in einem BIOS. :)

Dazu dann einen systemd-service, der ein script als user startet worüber 
der Rechner dann auch wieder ausgeschaltet wird.

Tausend Dank!

von Εrnst B. (ernst)


Lesenswert?

Kalle R. schrieb:
> Ich hatte diese
> Möglichkeit völlig vergessen, denn ich war schon bestimmt seit 10 Jahren
> nicht mehr in einem BIOS

Um die Start-Zeit einzustellen musst du übrigens nicht ins Bios, das 
geht per sysfs:
/sys/class/rtc/rtc0/wakealarm
-> da einfach einen Unix-Timestamp reinschreiben:

# echo 1635399999 > /sys/class/rtc/rtc0/wakealarm

("date +%s" hilft beim umrechnen an der shell)

oder per /usr/sbin/rtcwake aus dem util-linux paket.

Die systemd-timer mit wakeup machen im Prinzip auch nichts anderes.
Vorsicht: die RTC hat nur einen Wakeup-Timer, wenn da verschiedene Tools 
daran rumdrehen, gewinnt das letzte.

von JJ (Gast)


Lesenswert?

Auf den ersten Blick würde ich sagen, dass es schwierig wird soetwas 
zuverlässig hinzubekommen...
Darf ich fragen, was der Rechner tun soll? vll. gibt es ja eine 
einfachere Lösung für das eigentliche Problem.

von Klaus R. (klaus2)


Lesenswert?

...oder die zeitschaltuhr bestromt über ein kleines C-NT und seriell 
einen dicken Elko (für den "kurzen" impuls) einen optokoppler der den 
start knopf drückt - falls das zuverlässiger wird.

Bisschen dirty, hat aber einen gewissen charme - Und du kannst es in QnD 
posten :)

Klaus.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

JJ schrieb:
> Auf den ersten Blick würde ich sagen, dass es schwierig wird soetwas
> zuverlässig hinzubekommen...

Einen Linux-Rechner automatisch per interner Uhr zu einer bestimmten 
Zeit aus Powerdown aufzuwecken ist in meiner Erfahrung sehr zuverlässig. 
Macht mein VDR seit Ewigkeiten.

: Bearbeitet durch User
von Markus (Gast)


Lesenswert?

Die einfachste Methode wurde doch bereits erklärt:
- Rechner mittels /sys/class/rtc/rtc0/wakealarm aufwecken, z.B. 06:00 
Uhr morgens
- per Cron die gewünschte Anwendung starten (mit etwas Zeitpuffer, also 
06:03 Uhr)
- mit 2. Cronjob mittels systemd den Rechner runterfahren/schlafenlegen 
(wieder mit etwas Zeitpuffer, je nachdem wie lange die Anwendung 
benötigt

That's all....

von (prx) A. K. (prx)


Lesenswert?

Markus schrieb:
> (wieder mit etwas Zeitpuffer, je nachdem wie lange die Anwendung
> benötigt

Oder direkt als Abschlusshandlung der Anwendung.

von wächst nach (Gast)


Lesenswert?

Markus schrieb:
> Die einfachste Methode wurde doch bereits erklärt:
> - Rechner mittels /sys/class/rtc/rtc0/wakealarm aufwecken, z.B. 06:00
> Uhr morgens
> - per Cron die gewünschte Anwendung starten (mit etwas Zeitpuffer, also
> 06:03 Uhr)
> - mit 2. Cronjob mittels systemd den Rechner runterfahren/schlafenlegen
> (wieder mit etwas Zeitpuffer, je nachdem wie lange die Anwendung
> benötigt
>
> That's all....



>> Cronjob mittels systemd

Mnh, eher entweder cronjob oder systemd.timer

systemds timer sind vermutlich eh schon in Verwendung.
gib mal ein; systemctl list-timers --all
Da wird recht wahrscheinlich etwas laufen

sicher gibt tools die noch cronjobs anlegen,
systemctl list-timers --all
gegen:
for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user 
-l; done

Geh mit dem der die Jobs hat,
falls crontab -l nichts berichtet würde ich es lassen.

----

was: "timer-property"

diese seltsame syntax --timer-property=WakeSystem=true
scheint zu stimmen erzeugt jdf. den passenden Eintrag;

/run/systemd/transient/run-uNNN.timer
...
[Timer]
WakeSystem=yes



'systemd-run' erzeugt halt nur transiente/temporäre Dienste.
Wenns funktioniert kann man ja als Ersttäter ggf. die unitfiles aus 
/run/systemd/transient .service .timer als Vorlage nehmen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.