[gelöst] Crontab als angemeldeter Benutzer ausführen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Crontab als angemeldeter Benutzer ausführen

Beitrag von JTH » 24.03.2019 13:03:55

jph hat geschrieben: ↑ zum Beitrag ↑
24.03.2019 09:58:06
Du könntest für diesen User einen Timer in der systemd-User-Instanz anlegen, die beim Einloggen automatisch gestartet wird.
Das würd ich hier auch vorschlagen. Unter /etc/systemd/user/foobar.{service,timer} abgelegt und einmal aktiviert, gilt das ganze systemweit für alle Benutzer. So ein Timer wird ohne manuellen Extraaufwand pro Benutzer garantiert nur einmal ausgeführt, auch wenn der mehrfach gleichzeitig angemeldet ist.

Grobes Grundgerüst:

Code: Alles auswählen

$ cat /etc/systemd/unit/foobar.service
[Unit]
Description=Foobar service

[Service]
Type=oneshot
ExecStart=/bin/echo Foobar

$ cat /etc/systemd/user/foobar.timer
[Unit]
Description=Foobar timer

[Timer]
OnCalendar=hourly

[Install]
WantedBy=timers.target

# systemctl --global enable foobar.timer
Falls der Timer für Root nicht ausgeführt werden sollte:

Code: Alles auswählen

# systemctl --user mask foobar.timer
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
jph
Beiträge: 1049
Registriert: 06.12.2015 15:06:07
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Greven/Westf.

Re: Crontab als angemeldeter Benutzer ausführen

Beitrag von jph » 24.03.2019 15:37:01

JTH hat geschrieben: ↑ zum Beitrag ↑
24.03.2019 13:03:55
jph hat geschrieben: ↑ zum Beitrag ↑
24.03.2019 09:58:06
Du könntest für diesen User einen Timer in der systemd-User-Instanz anlegen, die beim Einloggen automatisch gestartet wird.
Das würd ich hier auch vorschlagen. Unter /etc/systemd/user/foobar.{service,timer} abgelegt und einmal aktiviert, gilt das ganze systemweit für alle Benutzer. So ein Timer wird ohne manuellen Extraaufwand pro Benutzer garantiert nur einmal ausgeführt, auch wenn der mehrfach gleichzeitig angemeldet ist.
Vereinfachungsvorschlag: wenn der Timer nur für einen User ausgeführt werden soll, dann kann man die Datei auch einfach in eines der in man 5 systemd.unit genannten Unterverzeichnisse im Home-Verzeichnis dieses Users legen.

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

Re: Crontab als angemeldeter Benutzer ausführen

Beitrag von JTH » 24.03.2019 15:47:49

jph hat geschrieben: ↑ zum Beitrag ↑
24.03.2019 15:37:01
Vereinfachungsvorschlag: wenn der Timer nur für einen User ausgeführt werden soll, dann kann man die Datei auch einfach in eines der in man 5 systemd.unit genannten Unterverzeichnisse im Home-Verzeichnis dieses Users legen.
Hier war ja nach einem Ansatz gefragt, der nicht für jeden Benutzer einzeln angelegt werden muss:
joe2017 hat geschrieben: ↑ zum Beitrag ↑
22.03.2019 15:32:50
ist es möglich einen Crontab immer als angemeldeten Benutzer auszuführen ohne das dieser für jeden Benutzer spezifisch angelegt wird?
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
joe2017
Beiträge: 1136
Registriert: 07.08.2017 14:29:51

Re: Crontab als angemeldeter Benutzer ausführen

Beitrag von joe2017 » 24.03.2019 19:02:12

Hallo zusammen,

da habt ihr natürlich Recht. Es wäre einfacher gewesen wenn ich euch mitgeteilt hätte was genau ich vorhabe. Jedoch dachte ich, dass es sinnvoller wäre wenn ich das allgemein halte und nicht spezifisch für einen einzelnen Fall Frage. So etwas kann man sicherlich auch in einem anderen Anwendungsfall benötigen.

Hier jedoch meine aktuelle Idee zu meiner Frage.
Ich hab das Problem, dass ich meine Benutzer über Ihre NFS Quota informieren möchte. Hierzu habe ich ein Script geschrieben welches die zur Verfügung stehende Quota mit dem aktuell verwendeten Speicher abgleicht. Dieses Script muss natürlich unter dem aktuell angemeldeten User in regelmäßigen Abständen ausgeführt werden. Falls jetzt die Idee der E-Mail Notification kommt. Das funktioniert leider nicht, da nicht jeder meiner Anwender über eine E-Mail Adresse verfügt.

Jetzt sind hier natürlich viele verschiedene Ansätze genannt worden. Ich werde mir das Ganze morgen genauer anschauen und prüfen was die beste alternative hierfür ist.
Falls noch jemand eine Idee hierzu hat wäre ich selbstverständlich sehr dankbar.

Guten Start in die Woche.

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Crontab als angemeldeter Benutzer ausführen

Beitrag von inne » 24.03.2019 21:29:25

Ähm Cron sendet doch aber auch eine E-Mail. Hier müsstet wohl das Setup angepasst werden damit auch Mails an lokale User gesendet werden können?! Im Grunde ist ein Username dann eine valide E-Mail-Adresse und wer eine externe hat, kann diese in die .forward eintragen.

Erkläre doch mal wie Du Quotas eingerichtet hast, denn ich kenne nur Linux File System Quotas (Aber stimmt, hier wird nur Root benachrichtigt)...

¢

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

Re: Crontab als angemeldeter Benutzer ausführen

Beitrag von JTH » 24.03.2019 21:51:03

joe2017 hat geschrieben: ↑ zum Beitrag ↑
24.03.2019 19:02:12
Falls noch jemand eine Idee hierzu hat wäre ich selbstverständlich sehr dankbar.
Das hängt dann nochmal davon ab, wie du konkret die Benachrichtigung der Benutzer lösen willst, wenn nicht per Mail :wink: Per notify-send?

Nur für das regelmäßige Ausführen des Skripts wirst du mit den erwähnten Systemd-Timern vermutlich den wenigsten Aufwand haben.
Manchmal bekannt als Just (another) Terminal Hacker.

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

Re: Crontab als angemeldeter Benutzer ausführen

Beitrag von MSfree » 25.03.2019 10:42:38

joe2017 hat geschrieben: ↑ zum Beitrag ↑
24.03.2019 19:02:12
Ich hab das Problem, dass ich meine Benutzer über Ihre NFS Quota informieren möchte. Hierzu habe ich ein Script geschrieben welches die zur Verfügung stehende Quota mit dem aktuell verwendeten Speicher abgleicht. Dieses Script muss natürlich unter dem aktuell angemeldeten User in regelmäßigen Abständen ausgeführt werden.
Deine Benutzer melden sich an einem Clientrechner an, der von einem NFS-Server Massenspeicher mountet, der mit Quota limitiert ist.

Nur der Server weiß, wieviel Platz ein bestimmter Benutzer belegt hat und wieviel er noch zu Verfügung hat. Also muß das Skript auch auf dem Server laufen.

Der Server hat aber absolut keine Ahnung davon, daß sich ein Benutzer an einem Client angemeldet hat. Der Client teilt das dem Server auch nie mit. Selbst das Mounten des Massenspeichers ist letzlich zustandslos und nicht an einen bestimmten Benutzer gebunden.

Nur der Client weiß, wann sich welcher Benutzer eingelogt hat. Ein auf dem Client laufendes Skript, wie auch immer mehr oder weniger regel,ässig gestartet, bringt dir aber keine Informationen darüber, was auf dem Server abgeht.

Deine ausgeklügelte Vorgehensweise wird so also nicht funktionieren können.

Ich halte es auch für bedenklich, deine Benutzer regelmässig damit zu nerven, ihnen mitzuteilen, wieviel Platz ihnen noch auf dem Server zur Verfügung steht.

Der Server hat bereits Mechanismen, der eine Aktion auslöst, wenn ein Benutzer einen bestimmten Grenzwert erreicht, z.B. wenn 80% seines Quota erreicht sind. Dann schickt er völlig selbstständig eine Email an Benutzer und an root. Damit läßt man die Benutzer zwar gewissenmassen ins "offene Messer" laufen. Das ganze wird aber dadurch abgemildert, daß man die Benachrichtigung nicht erst abschickt, wenn es zu spät ist, sondern bei erreichen des Softlimits. Der Benutzer kann dann zumindest seine aktuelle Arbeit noch speichern, muß aber sofort danach aufräumen.

Eine regelmässige Benachrichtigung ist also einierseits gar nicht nötig und ggfls. sogar für alle die nervend, die nie ans Limit kommen. Zum anderen ist es gar nicht möglich, den Loginvorgang am Client dem Server mitzuteilen, so daß dieser dann irgendwelche Aktionen ausführt. (OK, es ist nicht ganz unmöglich, aber technisch aufwendig, da über das Netzwerk kommuniziert werden muß, wer was macht, ohne daß es dafür Standardtools gäbe).

Benutzeravatar
joe2017
Beiträge: 1136
Registriert: 07.08.2017 14:29:51

Re: Crontab als angemeldeter Benutzer ausführen

Beitrag von joe2017 » 25.03.2019 11:10:39

Also noch mal ganz kurz zur Erklärung.

Ich habe einen Debian NFS Server mit einer Partition für meine /home/users Ordner. Diese sind für jeden Benutzer mit Quotas beschränkt.
Meine User melden sich an meinen Clients an, welche einen Mountpint zu dem NFS Server haben /home/users

Somit ist das Home Verzeichnis für jeden User auf meinem Server.
Mein User Quotas auf meinem Server lege ich mit einem Script an. Hierzu habe ich eine kleine Config Datei in welcher lediglich die Informationen User,SoftLimit,HardLimit stehen. Diese werden via Script gesetzt und zusätzlich zwei versteckte Dateien (.softlimit, .hardlimit) in dem jeweiligen User Verzeichnis (/home/users/$USER/) abgelegt. Somit kann ich auf dem User schon einmal mein SoftLimit/HardLimit auslesen.

Jetzt kommt mein Client Script zum Einsatz, welches den Belegten Speicher von meinem Profil überprüft und dies mit den Quotas abgleicht. Mein Script gibt wie richtig vermutet mittels notify-send dem Benutzer eine entsprechende Information aus. Das habe ich auch bereits alles getestet und es funktioniert einwandfrei. Lediglich die Sache mit dem Script unter dem angemeldeten Benutzer bringt mich zum Verzweifeln.

Benutzeravatar
joe2017
Beiträge: 1136
Registriert: 07.08.2017 14:29:51

Re: Crontab als angemeldeter Benutzer ausführen

Beitrag von joe2017 » 25.03.2019 13:12:06

Also ich habe jetzt mal ein Service mit dem Timer unter /etc/systemd/user/ eingerichtet.

Zum Test habe ich den Timer auf 1min gestellt. Der Timer führt meinen Service aus, welcher mein Script ausführt.
In dem Script habe ich testweise ein echo &USER > /path/testfile eingetragen.

Das Script wird wie erwartet mittels Timer und Service jede Minute ausgeführt. Jedoch wird in der Datei kein Username eingetragen. Es wird jede Minute eine weitere Leere Zeile hinzugefügt.
Ich befürchte somit, das mein Script nicht unter dem aktuell angemeldeten User ausgeführt wird. Woran könnte das noch liegen?
Anbei meine Files:
Service

Code: Alles auswählen

[unit]
Description=notify-send Quota Service

[Service]
ExecStart=/path/bash_notify-send_quota.sh

[Install]
WantedBy=multi-user.target
Timer

Code: Alles auswählen

[unit]
Description=notify-send Quota Timer

[Timer]
OnBootSec=0min
OnCalendar=*:0/1
Unit=bash_notify-send_quota.service

[Install]
WantedBy=multi-user.target
Script

Code: Alles auswählen

echo $USER >> /path/testfile
Ich habe auch noch folgendes durchgeführt

Code: Alles auswählen

systemctl --user --global enable /etc/systemd/user/bash_notify-send_quota.service

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

Re: Crontab als angemeldeter Benutzer ausführen

Beitrag von JTH » 25.03.2019 14:21:36

Code: Alles auswählen

[Install]
WantedBy=multi-user.target
Das lass mal beim Service weg, du willst ja den Timer benutzen um den Service zu starten. Der Service selbst soll nicht durch Abhängigkeiten beim Boot gestartet werden.

Deshalb ist das
joe2017 hat geschrieben: ↑ zum Beitrag ↑
25.03.2019 13:12:06
Ich habe auch noch folgendes durchgeführt

Code: Alles auswählen

systemctl --user --global enable /etc/systemd/user/bash_notify-send_quota.service
vermutlich kontraproduktiv, womöglich deine Fehlerquelle hier.

Beim Timer sollte laut Doku ein

Code: Alles auswählen

[Install]
WantedBy=timers.target
stehen – außer man weiß was man tut, wenn man dort anderes hinschreibt ;)

Die Environment enthält ansich schon USER und anderes, evtl. wurde der Timer hier einfach falsch gestartet.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
joe2017
Beiträge: 1136
Registriert: 07.08.2017 14:29:51

Re: Crontab als angemeldeter Benutzer ausführen

Beitrag von joe2017 » 25.03.2019 15:31:46

Ich habe gerade gesehen, dass ich noch einen alten crontab am laufen hatte. :facepalm: Diesen hab ich jetzt gelöscht.
Mein neu eingerichteter Timer mit dem Script läuft somit überhaupt nicht. Auch nach der Anpassung nicht!?

Den neuen Service habe ich jetzt nicht enabled. So wie ich das verstanden habe, sollte dieser automatisch durch den timer gestartet werden.
Der Service und der Timer liegen in dem Verzeichnis /etc/systemd/user/

Benutzeravatar
joe2017
Beiträge: 1136
Registriert: 07.08.2017 14:29:51

Re: Crontab als angemeldeter Benutzer ausführen

Beitrag von joe2017 » 25.03.2019 16:20:35

Ich habe das Problem gefunden. Ich musste für den Timer die executable bits entfernen. Warum auch immer?
Ich habe beim aktivieren des Timers die info erhalten das ich die executable bits entfernen soll.

Benutzeravatar
joe2017
Beiträge: 1136
Registriert: 07.08.2017 14:29:51

Re: Crontab als angemeldeter Benutzer ausführen

Beitrag von joe2017 » 25.03.2019 16:30:52

Vielen Dank noch mal an alle. :hail: Ich habe das Ganze gerade mit zwei verschiedenen Benutzern getestet.
Das mit dem Timer und dem Service / Script erscheint mir eine sehr saubere Lösung zu sein.

Falls interessant poste ich gerne meine gesamten Scripts und vorgehensweise für die NFS Notification.

Benutzeravatar
joe2017
Beiträge: 1136
Registriert: 07.08.2017 14:29:51

Re: [gelöst] Crontab als angemeldeter Benutzer ausführen

Beitrag von joe2017 » 25.03.2019 17:04:38

Eine letzte Frage hierzu noch. Alle wie viele Minuten sollte man so ein Script maximal laufen lassen ohne das dies meine Systeme stark beeinträchtigen?
Gibt es hierzu eine Best Practises von Debian?

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

Re: Crontab als angemeldeter Benutzer ausführen

Beitrag von JTH » 25.03.2019 17:29:14

joe2017 hat geschrieben: ↑ zum Beitrag ↑
25.03.2019 16:20:35
Ich musste für den Timer die executable bits entfernen. Warum auch immer?
Müssen tut man das nicht, es ist nur eine Warnung. Das es nicht ging, lag eher noch an deinem crontab-Überbleibsel.
joe2017 hat geschrieben: ↑ zum Beitrag ↑
25.03.2019 17:04:38
Alle wie viele Minuten sollte man so ein Script maximal laufen lassen ohne das dies meine Systeme stark beeinträchtigen?
Das hängt wieder etwas davon ab, was du ganz konkret machst ;) und wie viele Benutzer gleichzeitig angemeldet sein können. Einmal die Minute klingt aus dem Bauch heraus nicht zu oft.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
joe2017
Beiträge: 1136
Registriert: 07.08.2017 14:29:51

Re: [gelöst] Crontab als angemeldeter Benutzer ausführen

Beitrag von joe2017 » 25.03.2019 17:37:48

Im normalfall ist immer nur ein Benutzer angemeldet. Vielleicht mal zwei maximal drei. Aber generell melden sich die Benutzer ab. Es wird ehr selten ein Kontowechsel durchgeführt ohne das eine Abmeldung erfolgt.
Aktuell werde ich das Script (Timer/Service) lediglich für die Quota Notification nutzen. Wenn ich das alle Minute laufen lasse, sollte dies mein System nicht in den Knie zwingen. :-)

Vielen Dank zusammen!
Wie gesagt... Bei interesse poste ich gerne meine Endlösung.

Antworten