Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
.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.
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.
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"
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.
@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).
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:
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.
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.
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.
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.
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 calledchecking ##### 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.