Rechner 1 * pro Tag aufwachen lassen um Script auszuführen

OP #6855090
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
Gast #6855097
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.
Gast #6855098
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
Gast #6855102
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.
Gast #6855292
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.
Gast #6855341
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
OP #6860410
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!
#6860589
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.
Gast #6860599
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.
#6860626
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.
Gast #6860781
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....
Gast #6860876
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren