Ich versuche, das Programm RealTimeSync beim Reaktivieren des Systems aus dem Ruhezustand mithilfe eines Skripts auszuführen, das sich in einer /lib/systemd/system-sleep/
Datei RealTimeSync_kill_suspend.sh
mit folgendem Inhalt befindet:
#!/bin/sh
case $1 in
pre)
echo "$(date) - $1: Killing RealTimeSync" >> /home/bart/Applications/FreeFileSync/suspend_resume.log
kill -9 `ps -aux | pgrep RealTimeSync`
exit
;;
post)
echo "$(date) - $1: Invoking RealTimeSync resume script" >> /home/bart/Applications/FreeFileSync/suspend_resume.log
sh /home/bart/Applications/FreeFileSync/RealTimeSync_resume.sh
;;
esac
Ich weiß, dass es ein Unterskript RealTimeSync_resume.sh
mit folgendem Inhalt ausführt:
#!/bin/sh
echo "$(date) - Running RealTimeSync" >> /home/bart/Applications/FreeFileSync/suspend_resume.log
/home/bart/Applications/FreeFileSync/RealTimeSync /home/bart/Documents/Documents_backup.ffs_real &
echo "$(date) - RealTimeSync should be running" >> /home/bart/Applications/FreeFileSync/suspend_resume.log
exit
da es Zeilen nach beiden echo
Anweisungen im RealTimeSync_kill_suspend.sh
Skript und Zeilen nach beiden echo
Anweisungen im RealTimeSync_resume.sh
Unterskript in eine Protokolldatei löscht suspend_resume.log
:
czw, 5 sie 2021, 16:55:50 CEST - pre: Killing RealTimeSync
czw, 5 sie 2021, 16:55:58 CEST - post: Invoking RealTimeSync resume script
czw, 5 sie 2021, 16:55:58 CEST - Running RealTimeSync
czw, 5 sie 2021, 16:56:28 CEST - RealTimeSync should be running
Aber wenn ich nach dem Prozess suche, ps -aux | grep RealTimeSync
wird keine richtige Übereinstimmung angezeigt, nur:
bart 31262 0.0 0.0 12252 2612 pts/0 S+ 17:38 0:00 grep --color=auto RealTimeSync
Wenn ich das Unterskript mit ausführe, sh /home/bart/Applications/FreeFileSync/RealTimeSync_resume.sh
wird der korrekte Prozess mit folgendem ausgeführt ps -aux | grep RealTimeSync
:
bart 31066 0.0 0.0 212 68 pts/0 S 17:37 0:00 /home/bart/Applications/FreeFileSync/RealTimeSync /home/bart/Documents/Documents_backup.ffs_real
bart 31071 0.3 0.1 442428 41260 pts/0 Sl 17:37 0:00 /home/bart/Applications/FreeFileSync/Bin/RealTimeSync_x86_64 /home/bart/Documents/Documents_backup.ffs_real
bart 31262 0.0 0.0 12252 2612 pts/0 S+ 17:38 0:00 grep --color=auto RealTimeSync
Alle genannten Dateien haben -rwxr-xr-x
Berechtigungen.
Nach einer Suche in Foren kam ich auf die Idee, dass RealTimeSync einen Dienst benötigt, der bei der Anmeldung aktiviert wird und nicht verfügbar ist. Beispielsweise benötigten Leute, die Probleme mit der Ausführung von Skripten beim Starten von Synclients hatten, einen X-Server für die Verbindung:
declare -x DISPLAY=":0.0"
declare -x XAUTHORITY="/home/<your user>/.Xauthority"
synclient VertEdgeScroll=1 VertTwoFingerScroll=1 HorizTwoFingerScroll=1 HorizEdgeScroll=1
aus diesem Forenthread:https://ubuntuforums.org/showthread.php?t=2380045
Ich wäre für jede Hilfe dankbar.
BEARBEITEN 1
Ich habe festgestellt, dass „FreeFileSync und ReadTimeSync Zugriff auf die grafische X11-Anzeige benötigen, sodass sie nicht im Systemmodus ausgeführt werden können. Im Benutzermodus kennt systemd die grafische Benutzersitzung und verwendet sie.“ Es gibt also zwei mögliche Lösungen:
Von einer der oben genannten Methoden, Festcodierung DISPLAY
und XAUTHORITY
wird abgeraten, da der Anzeigewert von Sitzung zu Sitzung unterschiedlich sein kann.
Oder als Benutzerdienst und nicht als Systemdienst ausgeführt, da die Anzeige für den Benutzer initialisiert wird.
Folgendes habe ich bei der Fehlerbehebung bei der Ausführung von FreeFileSync als Systemdienst gefunden:https://unix.stackexchange.com/questions/529115/system-service-error-unable-to-initialize-gtk-is-display-set-properly
Leider habe ich Probleme bei der Umsetzung dieser Lösungen, ich bin für jede Hilfe dankbar.
BEARBEITEN 2
Ok, ich habe es geschafft! Ich führe RealTimeSync jetzt vom Hauptskript aus aus, obwohl ich denke, dass das keinen Unterschied macht. Wichtig ist, 'DISPLAY' wie folgt zu initialisieren:
#!/bin/sh
case $1 in
pre)
echo "$(date) - $1: Killing RealTimeSync" >> /home/bart/Applications/FreeFileSync/suspend_resume.log
kill -9 `ps -aux | pgrep RealTimeSync`
exit
;;
post)
echo "$(date) - Invoking RealTimeSync resume script" >> /home/bart/Applications/FreeFileSync/suspend_resume.log
env DISPLAY=:1 sudo -u bart /home/bart/Applications/FreeFileSync/RealTimeSync /home/bart/Documents/Documents_backup.ffs_real
;;
esac
Und legen Sie den Besitzer dieses Skripts auf „Root“ fest:chown root:root <script_name>
Die Lösung war von hier:Skript nach Fortsetzen als angemeldeter Benutzer (nicht Root) starten
So wie ich das verstehe, ist das eher ein Umweg als eine richtige Lösung, da Hardcoding DISPLAY
Probleme bereiten könnte, aber es funktioniert vorübergehend. Falls jemand weiß, wie man das als Benutzer (nicht als Root) richtig ausführt, wäre ich für jeden Hinweis dankbar.