Prozess oder Script einmalig zu einem bestimmten Zeitpunkt ausführen

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
Richard
Beiträge: 641
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Prozess oder Script einmalig zu einem bestimmten Zeitpunkt ausführen

Beitrag von Richard » 16.06.2024 13:05:36

Hallo,

ich habe auf meinem Raspberry Pi bestimmte regelmäßig ablaufende Prozesse eingerichtet, die ich alle über Cron starte. Von Zeit zu Zeit wäre es günstig einen Prozess (z. B. wenn ein Download erfolgen soll) zeitweise auszusetzen (z. B. weil etwas gestreamt wird). Ich habe ein Youtube-Script das alle 30min meine private Playlist checkt ob ein neues Video geladen werden kann. Das Script checkt ob eine "Lock"-Datei in /tmp angelegt ist, wenn nicht legt es diese an und beginnt den DL. Wenn diese Datei da ist läuft parallel das Script bereits und die zweite Instanz startet nicht. Bisher habe ich das pausieren so gelöst, dass ich diese Lock-Datei einfach manuell erstellt habe und über einen zweiten Cron Nachts um 4 diese IMMER löschen lasse.

Gibt es ein Tool wo man ein einfaches Kommando absetzt, dass dann zu einem bestimmten Zeitpunkt etwas ausführt? Etwa

Code: Alles auswählen

command -create /tmp/lock 15:00 -delete /tmp/lock 17:00
Hier würde sich Linux darum kümmern um 15:00 Uhr die Datei /tmp/lock anzulegen und sie um 17:00 Uhr wieder zu löschen, was die Ausführung des Scriptes in genau dieser Zeit blockieren würde. Am Ende möchte ich das ganze vom Tablet oder Smartphone aus machen. Das manuelle Erstellen der Lock-Datei mache ich da auch schon von Smartphone aus über eine SSH-Verbindung mit der App "Termux". Den wie auch immer aussehenden Command abzusetzen wäre also kein Thema.

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

Re: Prozess oder Script einmalig zu einem bestimmten Zeitpunkt ausführen

Beitrag von JTH » 16.06.2024 13:09:05

Da bieten sich systemd-run und at an.
Manchmal bekannt als Just (another) Terminal Hacker.

tobo
Beiträge: 2118
Registriert: 10.12.2008 10:51:41

Re: Prozess oder Script einmalig zu einem bestimmten Zeitpunkt ausführen

Beitrag von tobo » 16.06.2024 16:22:59

Richard hat geschrieben: ↑ zum Beitrag ↑
16.06.2024 13:05:36
Gibt es ein Tool wo man ein einfaches Kommando absetzt, dass dann zu einem bestimmten Zeitpunkt etwas ausführt? Etwa

Code: Alles auswählen

command -create /tmp/lock 15:00 -delete /tmp/lock 17:00
Hier würde sich Linux darum kümmern um 15:00 Uhr die Datei /tmp/lock anzulegen und sie um 17:00 Uhr wieder zu löschen, was die Ausführung des Scriptes in genau dieser Zeit blockieren würde.
Man kann diese Verzögerung von 2 Stunden verschieden angeben - man gibt zwei Zeitpunkte mit 2 Befehlen an oder man gibt nur den ersten Zeitpunkt an und verzögert dann 2 Stunden (in einem aufgerufenem Skript oder auf der Befehlszeile). Bei at z.B.:

Code: Alles auswählen

// Beim jeweils "nächsten" 15:00 und 17:00 Uhr:
at 15:00 <<< 'touch /tmp/lock'
at 17:00 <<< 'rm /tmp/lock'

// oder morgen und in einer Zeile:
at 15:00 2024-06-17 <<< 'touch /tmp/lock; sleep 2h; rm /tmp/lock'
Soll das periodisch sein, also z.B. jeden Tag, dann natürlich cron anstatt at. Der erste Fall (reine Zeitangabe ohne Datum) wird dich beißen, wenn du zwischen 15:00 und 17:00 Uhr die Befehle absetzt, weil sie sich dann auf ein unterschiedliches Datum beziehen. Falls at zum entsprechenden Zeitpunkt nicht vorhanden ist (also z.B. Rechner aus), dann wird der Befehl schnellstmöglich nachgeholt.

Benutzeravatar
GregorS
Beiträge: 2877
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Prozess oder Script einmalig zu einem bestimmten Zeitpunkt ausführen

Beitrag von GregorS » 16.06.2024 18:25:22

Richard hat geschrieben: ↑ zum Beitrag ↑
16.06.2024 13:05:36
Gibt es ein Tool wo man ein einfaches Kommando absetzt, dass dann zu einem bestimmten Zeitpunkt etwas ausführt?
Ich erledige solche Dinge mit 'at'. Ich benutze at z.B. als Timer – „nach Ablauf von bla wird blubb ausgeführt“.

Beispiel:

Code: Alles auswählen

gszaktilla@lili:~$ at now + 2min
warning: commands will be executed using /bin/sh
at Sun Jun 16 18:35:00 2024
at> ffplay doing.mp3
at> <EOT>
job 3 at Sun Jun 16 18:35:00 2024
gszaktilla@lili:~$
Nach der Eingabe des Befehls (ffplay...) drücke ich Strg-D
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

fischig
Beiträge: 3788
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Prozess oder Script einmalig zu einem bestimmten Zeitpunkt ausführen

Beitrag von fischig » 17.06.2024 09:15:04

GregorS hat geschrieben:Nach der Eingabe des Befehls (ffplay...) drücke ich Strg-D
nur zur Verdeutlichung: Strg+D ist als Beendigung/Bestätigung des at-Kommandos obligatorisch, heißt: ohne diesen Tastaturcode macht Debianat gar nichts.

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

Re: Prozess oder Script einmalig zu einem bestimmten Zeitpunkt ausführen

Beitrag von Meillo » 17.06.2024 09:26:54

Ich will hier nur auf ein paar Feinheiten eingehen, zum besseren/korrekteren Verstaendnis.

Also, Klugscheissmodus an. :-D

Ein Prozess ist ein Programm in Ausfuehrung. D.h. einen Prozess kann man nicht ausfuehren, da er dadurch definiert ist, dass er sich bereits in Ausfuehrung befindet. ;-) Gemeint war natuerlich: ein Programm ausfuehren.


Strg-D (auch ^D geschrieben) ist nicht die Beendigung/Bestaetigung des at-Kommandos, sondern at liest von Standard-in. ^D signalisiert das Ende der Datei, d.h. at realisiert dann, dass es den kompletten Inhalt von Stdin gelesen hat. Wenn man die Standard-Eingabe umleitet, dann braucht man kein ^D weil die Datei aus der at dann liest ein ``natuerliches Ende'' hat. Die folgenden Formen entsprechen sich somit:

Code: Alles auswählen

$ at now + 5 minutes
date
^D
$

Code: Alles auswählen

$ echo date | at now + 5 minutes
Oder auch mit der Verwendung eines Heredocs:

Code: Alles auswählen

$ at now + 5 minutes <<!
date
!
$
Use ed once in a while!

Richard
Beiträge: 641
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Re: Prozess oder Script einmalig zu einem bestimmten Zeitpunkt ausführen

Beitrag von Richard » 17.06.2024 13:16:15

'at' werde ich mal testen. Blöd hier ist, dass man gesetzte Aufgaben nur mit root abrufen und ggf. vor ihrer Ausführung wieder abbrechen kann.

Ist das bei systemd-run besser gelöst?

Benutzeravatar
GregorS
Beiträge: 2877
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Prozess oder Script einmalig zu einem bestimmten Zeitpunkt ausführen

Beitrag von GregorS » 17.06.2024 13:22:00

Richard hat geschrieben: ↑ zum Beitrag ↑
17.06.2024 13:16:15
'at' werde ich mal testen. Blöd hier ist, dass man gesetzte Aufgaben nur mit root abrufen und ggf. vor ihrer Ausführung wieder abbrechen kann.
Hä? Ich kann at-Jobs, die ich eingerichtet habe, auch abfragen und löschen:

Code: Alles auswählen

gszaktilla@lili:~$ at now+2min
warning: commands will be executed using /bin/sh
at Mon Jun 17 13:20:00 2024
at> tuwas
at> <EOT>
job 4 at Mon Jun 17 13:20:00 2024
gszaktilla@lili:~$ atq
4       Mon Jun 17 13:20:00 2024 a gszaktilla
gszaktilla@lili:~$ atrm 4
gszaktilla@lili:~$ atq
gszaktilla@lili:~$ 
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

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

Re: Prozess oder Script einmalig zu einem bestimmten Zeitpunkt ausführen

Beitrag von MSfree » 17.06.2024 13:49:19

GregorS hat geschrieben: ↑ zum Beitrag ↑
17.06.2024 13:22:00
Hä? Ich kann at-Jobs, die ich eingerichtet habe, auch abfragen und löschen:
Damit das klappt, muß man den Benutzer in /etc/at.allow eintragen. Sonst darf eben nur root at benutzen.

Benutzeravatar
GregorS
Beiträge: 2877
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Prozess oder Script einmalig zu einem bestimmten Zeitpunkt ausführen

Beitrag von GregorS » 17.06.2024 13:53:16

MSfree hat geschrieben: ↑ zum Beitrag ↑
17.06.2024 13:49:19
GregorS hat geschrieben: ↑ zum Beitrag ↑
17.06.2024 13:22:00
Hä? Ich kann at-Jobs, die ich eingerichtet habe, auch abfragen und löschen:
Damit das klappt, muß man den Benutzer in /etc/at.allow eintragen. Sonst darf eben nur root at benutzen.
Ups?! Ich musste diese Datei noch nie bearbeiten.
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

mat6937
Beiträge: 3209
Registriert: 09.12.2014 10:44:00

Re: Prozess oder Script einmalig zu einem bestimmten Zeitpunkt ausführen

Beitrag von mat6937 » 17.06.2024 15:26:40

GregorS hat geschrieben: ↑ zum Beitrag ↑
17.06.2024 13:53:16
Ups?! Ich musste diese Datei noch nie bearbeiten.
Dann ist die /etc/at.deny (... per default?) vorhanden und leer, denn:

Code: Alles auswählen

An empty /etc/at.deny means that every user may use at.

       If neither exists, only the superuser is allowed to use at.
Quelle: manpage
Debian 12.6 mit LXDE, OpenBSD 7.5 mit i3wm, FreeBSD 14.0 mit Xfce

Benutzeravatar
GregorS
Beiträge: 2877
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Prozess oder Script einmalig zu einem bestimmten Zeitpunkt ausführen

Beitrag von GregorS » 17.06.2024 15:34:03

mat6937 hat geschrieben: ↑ zum Beitrag ↑
17.06.2024 15:26:40
GregorS hat geschrieben: ↑ zum Beitrag ↑
17.06.2024 13:53:16
Ups?! Ich musste diese Datei noch nie bearbeiten.
Dann ist die /etc/at.deny (... per default?) vorhanden und leer ...
Das muss wohl ein Default sein. Meine at.deny ist allerdings nicht leer:

Code: Alles auswählen

root@lili:~# cat /etc/at.deny 
alias
...
www-data
root@lili:~# 
Wahrscheinlich darf ich, weil ich da nicht drin stehe.
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

tobo
Beiträge: 2118
Registriert: 10.12.2008 10:51:41

Re: Prozess oder Script einmalig zu einem bestimmten Zeitpunkt ausführen

Beitrag von tobo » 17.06.2024 16:04:43

Richard hat geschrieben: ↑ zum Beitrag ↑
17.06.2024 13:16:15
'at' werde ich mal testen. Blöd hier ist, dass man gesetzte Aufgaben nur mit root abrufen und ggf. vor ihrer Ausführung wieder abbrechen kann.
Mit der Installation von at kannst du at im vollen Umfang - als normaler Benutzer - benutzen. Du musst da überhaupt nichts konfigurieren oder in irgendwelche Dateien reinschreiben.
Wenn das bei dir so nicht funktioniert, dann ist anzunehmen, dass du einen Job als Root erstellt hast, den du dann auch nur als Root bearbeiten kannst. Root sieht (`at -l') alle Jobs aller Benutzer, ein Benutzer sieht nur seine eigenen Jobs und kann auch nur die bearbeiten.
Die Datei /etc/at.deny ist nach der Installation befüllt, aber selbst wenn die leer ist, funktioniert at noch. Nur wenn sie nicht vorhanden ist, dann kommt der Ruf nach dem Root-Benutzer. Im Zweifel at also runterschmeißen und at neu installieren.

Antworten