Spaß Terminal Bildschirmschoner

Crys

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.665
Hi Zusammen,

ich bin neulich auf etwas gestoßen, bekomme es aber nicht zum laufen: https://github.com/xiongchiamiov/terminal-screensaver

.terminal-screensaver.conf habe ich nach ~/ kopiert, den Rest nach ~/Documents/terminal-screensaver/, nun bekomme ich aber nach ab-/anmelden immer den Fehler: terminal-screensaver-reset: Befehl nicht gefunden.

Was habe ich falsch gemacht?

System: Ubuntu 16 LTS
 
Das heißt? Nach googel habe ich herausgefunden das damit wahrscheinlich die Umgebungsvariable gemeint ist. Was soll da aber eingetragen werden?
PATH=$PATH:~/Documents/terminal-screensaver/terminal-screensaver-reset brachte keinen Erfolg.
 
Mach doch mal genau das was in der Anleitung steht.
Das was Du oben in Deiner Frage schreibst weicht erheblich von dem ab was in der Anleitung wirklich steht.

BFF
 
Vielen Dank. Ich dachte ich mache das was in der Anleitung steht. Nochmals: Was mache ich falsch? Was weicht ab?
Ergänzung ()

1. Copy terminal-screensaver.conf.example to ~/.terminal-screensaver.conf and modify as you wish.
Datei ist heruntergeladen und umbennant ✔
2. In your ~/.bashrc or ~/.zshrc, add a sourcing of the terminal-screensaver-include.sh file:
screensaver_source=$HOME/Documents/terminal-screensaver/terminal-screensaver-include.sh
[[ -s "$screensaver_source" ]] && source "$screensaver_source"
Den Zweizeiler hinzugefügt ✔
3. Put terminal-screensaver and terminal-screensaver-reset somewhere in your PATH.
Ich hab das somewhere in meinen PATH geadded PATH=$PATH:~/terminal-screensaver/Documents/terminal-screensaver PATH=$PATH:~/terminal-screensaver/Documents/terminal-screensaver-reset
4. Read the comments in terminal-screensaverd and run it.
Gelesen, keine weiteren Anweisungen gefunden ✔
 
Zuletzt bearbeitet:
Hast du die Umgebungsvariablen in ~/.bashrc eingetragen, also etwa
Bash:
echo "PATH=$PATH:~/terminal-screensaver/Documents/terminal-screensaver" >> ~/.bashrc
echo "PATH=$PATH:~/terminal-screensaver/Documents/terminal-screensaver-reset" >> ~/.bashrc
?
 
@Amaoto: Ich dachte ich hätte das mit den Zeilen aus 3. gemacht (zumindest temporär, bis zum nächsten abmelden)? Zumindest werden die Pfade bei echo $PATH gelistet.
 
In der ~/.bashrc ist jetzt der PATH auch eingetragen. Selber Fehler weiterhin.
Versuchsweise habe ich die PATH Zeile auch in ~/.profile eingetragen (aus .bashrc auskommentiert), aber trotzdem das selbe.
Ergänzung ()

Noch mal alles detailiert. Ich verstehe auch nicht was da so kompliziert ist, bzw. was nicht stimmt:
Bash:
user@nas:~$ ls -al
insgesamt 7592
[...]
drwxrwxrwx  2 user user    4096 Jul 11 18:18 terminal-screensaver
-rwxrwxrwx  1 user user      75 Jul 10 21:09 .terminal-screensaver.conf
[...]
Den Ordner 'Documets' habe ich mir mal gespart, alle Rechte sind gegeben (ok, zu viele).
Bash:
user@nas:~$ cat .terminal-screensaver.conf
idle-minutes-until-start 1
screensaver-command /usr/local/bin/cmatrix -ab
Nachfolgende Zeilen habe ich ergänzt:
Bash:
user@nas:~$ cat .bashrc
[...]
# terminal-screensaver
screensaver_source=$HOME/terminal-screensaver/terminal-screensaver-include.sh
[[ -s "$screensaver_source" ]] && source "$screensaver_source"

PATH=$PATH:~/terminal-screensaver/Documents/terminal-screensaver:~/terminal-screensaver/Documents/terminal-screensaver-reset
Die Umgebungsvariable sollte auch passen:
Code:
user@nas:~$ echo $PATH
/home/user/bin:/home/user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/user/terminal-screensaver/Documents/terminal-screensaver:/home/user/terminal-screensaver/Documents/terminal-screensaver-reset
Nun zum Inhalt des Ordners:
Bash:
user@nas:~/terminal-screensaver$ ls -al
insgesamt 20
drwxrwxrwx  2 user user 4096 Jul 11 18:29 .
drwx------ 15 user user 4096 Jul 11 18:27 ..
-rwxrwxrwx  1 user user 1250 Jul 10 22:21 terminal-screensaver
-rwxrwxrwx  1 user user  756 Jul 10 21:16 terminal-screensaver-include.sh
-rwxrwxrwx  1 user user   69 Jul 10 22:21 terminal-screensaver-reset
Die Datei terminal-screensaverd ist neuer als terminal-screensaver (ohne d), also habe ich die erstere umbennt in ohne d.
Bash:
user@nas:~/terminal-screensaver$ cat terminal-screensaver
#!/bin/bash

function conf() {
        # Improved function still relies on tilde expansion, but should be safe.
        # Feel free to create user accounts named '`rm -rf /`' if you like :)
        # This also only returns the first match in the file, rather than
        # potentially returning a confusing mess if multiple options match.
        # Exception handling is non-existant, but that's nothing new.
        # Thanks to cut's nature, matching lines containing no spaces
        # will be returned unaltered.
        if [ "x$2" = "x" ]; then
                homedir=~
        else
                eval homedir="$(printf "~%q" "$2")"
        fi
        [ -d "$homedir" ] || return 2 # user has a home directory?
        [ -e "$homedir/.terminal-screensaver.conf" ] || return 3 # that directory has a config file?
        [ -O "$homedir/.terminal-screensaver.conf" ] || return 4 # that config file is safe?
        grep -m 1 -e "^$1" -- "$homedir/.terminal-screensaver.conf" | cut -d' ' -f2-
}

PID_DIR=~/terminal-screensaver
mkdir -p $PID_DIR
chmod a+w $PID_DIR

while :; do
        echo "screensaverd called"
        for pid in `ls $PID_DIR`; do
                echo "checking $pid"
                user=`ps -o user= $pid`
                idle="`conf 'idle-minutes-until-start' $user`"
                if test `find $PID_DIR/$pid -mmin +$idle`; then
                        echo "too old"
                        kill -SIGALRM $pid || rm $PID_DIR/$pid
                fi
        done
        sleep 15
done
Bash:
user@nas:~/terminal-screensaver$ cat terminal-screensaver-include.sh
# $SHELL is unreliable.  In particular, it doesn't get reset when I run bash
# inside zsh for testing. :)
# http://liquidat.wordpress.com/2007/07/28/short-tip-determine-current-shell/
# Sometimes we get '-zsh' or similar, so strip out that dash.
shell=`ps -p $$ | tail -1 | awk '{print $NF}' | sed 's/-//'`

# For development purposes only!
#PATH=$PATH:.

case $shell in
"bash")
        trap 'terminal-screensaver-reset' DEBUG
        trap 'terminal-screensaver' SIGALRM
        ;;
"zsh")
        function preexec () { terminal-screensaver-reset; }
        trap 'terminal-screensaver' SIGALRM
        ;;
esac

# Use the PID to differentiate between shells.  We need to save it here because
# the scripts will run under their own PIDs.
export terminal_screensaver_pid=$$
terminal-screensaver-reset
Hier habe ich auch /bin/sh durch /bin/bash ersetzt:
Bash:
user@nas:~/terminal-screensaver$ cat terminal-screensaver-reset
#!/bin/bash

touch ~/terminal-screensaver/$terminal_screensaver_pid


Jedes mal wenn ich aber einen x-belibigen Befehl eingebe bekomme ich die Meldung:
terminal-screensaver-reset: Befehl nicht gefunden.
 
Zuletzt bearbeitet:
Du fügst ein Skript, einen Symlink etc. dem Pfad hinzu, indem du die Datei in ein Verzeichnis legst, das Teil des Pfades ist. Also z. B. mit ln -s /home/user/app.sh /home/user/.local/bin/app.
 
@Iapetos: Sorry, ich verstehe nicht was du damit aussagen möchtest?

Wieso möchte ich eine symbolische Verknüpfung anlegen? Der Pfad in dem die besagten Skripte liegen ist ja schon Teil von PATH, oder nicht?
 
Warum gibst du im PATH die ausführbare Datei terminal-screensaver-reset an? Nur das Verzeichnis zur Datei sollte genügen.
 
@Evil E-Lex: Ich weiß nicht, dachte das steht so explizit unter 3. in der Anleitung (bzw. haben deine Vorposter ja auch so geschrieben) 🤷‍♂️

Ich habe nun den Pfad hinzugefügt und den die erweiterung von PATH vor den anderen Befehlen in ~/.bashrc verschoben:
Bash:
[...]
PATH=$PATH:~/terminal-screensaver
screensaver_source=$HOME/terminal-screensaver/terminal-screensaver-include.sh
[[ -s "$screensaver_source" ]] && source "$screensaver_source"
Nun wird keine Fehlermeldung mehr angezeigt (ohne das verschieben wurde beim anmelden im Terminal immer 5x noch der besagte Fehler angezeigt).
Aber passieren tut jetzt auch nichts ... einfach gar nichts ...

Im Ordner ~/terminal-screensaver/ werden jetzt die PID-Dateien angelegt, diese sind aber immer 0 Byte groß, soll das so sein?
Bash:
user@nas:~/terminal-screensaver$ ls -al
insgesamt 20
drwxrwxrwx  2 user user 4096 Jul 13 13:37 .
drwx------ 15 user user 4096 Jul 13 13:42 ..
-rw-r--r--  1 user user    0 Jul 13 13:37 5330
-rw-r--r--  1 user user    0 Jul 13 13:45 5740
-r-xr--r--  1 user user 1515 Jul 13 13:35 terminal-screensaver
-r-xr--r--  1 user user  797 Jul 13 13:35 terminal-screensaver-include.sh
-r-xr--r--  1 user user   68 Jul 13 13:36 terminal-screensaver-reset


Außerdem waren alle Dateien in ~/terminal-screensaver/ weg (nachdem ich das mit PATH geändert hatte), bewusst habe ich aber nichts gelöscht. Ich habe die Dateien wie beschrieben wieder angelegt.

Dachte das ist ne ganz simple Sache!?
 
Es soll nicht herablassend klingen bzw. ist es auch nicht gemeint, aber es gibt ein hervorragendes Buch von William Shotts, das sich sehr eingängig und verständlich mit den Grundlagen der Shell auseinandersetzt. Es ist sowohl als E-Book unter Creative-Commons-Lizenz herunterladbar als auch in Printform im Buchhandel erhältlich.

Der Gedanke hinter den typischerweise im PATH angegebenen Verzeichnisse ist, dass es definierte Orte gibt, aus denen ausführbare Dateien ohne weitere Angabe bzw. das Wechseln in ein Verzeichnis nötig ist. Der vorgesehene Weg ist, diese so zu nutzen, denn jedes dieser Verzeichnisse erfüllt seinen Zweck:
  • /usr/bin (früher oft nur /bin): allgemeine Dateien/Programme, die jeder Nutzer sehen bzw. abhängig von den Nutzerrechten ausführen kann
  • /usr/sbin (früher oft nur /sbin): wichtige Systemprogramme (historisch), letztlich aber wie oben
  • /usr/local/bin: Manuell kompilierte und installierte ausführbare Dateien
  • ...
  • ~/.local/bin (auch teilweise nur ~/bin): Programme, die nur vom jeweiligen Nutzer genutzt werden sollen
Also anstelle in deiner $PATH-Variablen herumzufummeln (Thema für Fortgeschrittene) solltest du dein Skript einfach in den Pfad ~/.local/bin kopieren oder verlinken.
 
  • Gefällt mir
Reaktionen: lokon
Danke @Iapetos. Ich habe mal aus ~/.bashrc die eine PATH Zeile auskommentiert und symbolische Verknüpfungen erstellt:
Bash:
ln -s ~/terminal-screensaver/terminal-screensaver ~/.local/bin/terminal-screensaver
ln -s ~/terminal-screensaver/terminal-screensaver-include.sh ~/.local/bin/terminal-screensaver-include.sh
ln -s ~/terminal-screensaver/terminal-screensaver-reset ~/.local/bin/terminal-screensaver-reset
Bei jedem Anmelden erhalte ich nun wieder schön viele Fehlermeldungen:
Code:
Last login: Sat Jul 13 21:51:32 2019 from 10.1.1.111
terminal-screensaver-reset: Befehl nicht gefunden.
terminal-screensaver-reset: Befehl nicht gefunden.
terminal-screensaver-reset: Befehl nicht gefunden.
terminal-screensaver-reset: Befehl nicht gefunden.
terminal-screensaver-reset: Befehl nicht gefunden.
user@nas:~$
... bei weiteren Eingaben aber nicht ... nun gut ... starten tut aber immer noch nichts.

Ist das verwenden von symbolische Verknüpfungen in ~/.local/bin ein "sollte man allgemein machen, weil es richtig ist, ändert aber in meinem Fall nichts" oder sollte mir das wirklich bei meinem Problem weiter helfen?
 
Es ist gute Praxis und hat sich etabliert. Offenbar ändert es in deinem Fall aber nichts, weil das Problem an anderer Stelle sitzt. Wohin hast du die Datei terminal-screensaver-reset kopiert? Sie sollte idealerweise in ~/.local/bin liegen.
 
Iapetos schrieb:
Es ist gute Praxis und hat sich etabliert.
Dann versuche ich das in Zukunft auch (entgegen vieler Anleitungen) zu machen. Leider kommt es so trotzdem zu Fehlermeldungen, deshalb würde ich hier weiter den Einzeiler in .bashrc bevorzugen.

Iapetos schrieb:
Wohin hast du die Datei terminal-screensaver-reset kopiert? Sie sollte idealerweise in ~/.local/bin liegen.
Aktuell in ~/terminal-screensaver/. Die Datei wird dort gefunden. Wenn ich diese nach ~/.local/bin kopiere oder verknüpfe wird diese weiterhin gefunden und es passiert auch weiter leider nichts.

Wenn ich terminal-screensaver direkt ausführe (irgendwo), dann startet auch der eingestellte Bildschirmschoner, das Zeitsteuern klappt nicht.
Ich denke der Fehler liegt bei terminal-screensaverd oder terminal-screensaver. Aktuell verwende ich den Inhalt aus der Datei ohne d, da wenn ich den andere ausführe er nur screensaverd called checking ##### ausgibt.
 
Ich habe die Dateien überflogen und begreife ungefähr, was sie tun.
  • In der terminal-screensaver.conf wird festgelegt, nach wie vielen Minuten Untätigkeit welcher Befehl ausgeführt werden soll.
  • terminal-screensaver-reset wird von terminal-screensaver-include.sh aufgerufen und macht nichts anderes, als die Datei /var/run/terminal-screensaver/$terminal_screensaver_pid (eine leere Textdatei) zu schreiben, also mit einem Zeitstempel zu versehen.
  • terminal-screensaverd ist der Daemon, der
    • prüft, ob eine valide terminal-screensaver.conf vorhanden ist
    • alle 15 s anhand des Alters der Datei /var/run/terminal-screensaver/prüft, ob Nutzereingaben in einem gewissen Zeitraum stattgefunden haben oder nicht. Wenn nicht, startet er terminal-screensaver.
  • terminal-screensaver prüft genau so wie der Daemon die Gültigkeit der .conf, setzt die Variable $screensaver anhand der .conf und ruft dann den Inhalt dieser Variablen auf.
  • terminal-screensaver-include.sh exportiert die Variable $terminal_screensaver_pid und ruft terminal-screensaver-reset auf. Außerdem ist es ein Hilfsskript, das der jeweiligen Shell (bash oder zsh) spezifische Befehle weitergibt. Es wird bei jedem Aufruf der Shell geladen, weil der Pfad dieses Skripts der .bashrc oder .zshrc hinzugefügt wird bzw. werden soll.
Das Problem beginnt bei dir schon mit der terminal-screensaver-include.sh - das Skript findet die terminal-screensaver-reset nicht, weil es wahrscheinlich nicht im $PATH liegt. Das erkennt man an den Meldungen beim Aufrufen der Shell. Der "Bildschirmschoner" setzt dann nicht ein, weil kein PID-File von der besagten terminal-screensaver-reset geschrieben worden ist.
 
Zurück
Oben