我尝试在系统从睡眠状态恢复时使用位于/lib/systemd/system-sleep/
文件中的脚本运行程序 RealTimeSync RealTimeSync_kill_suspend.sh
,其内容如下:
#!/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
RealTimeSync_resume.sh
我知道它执行以下内容的子脚本:
#!/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
因为它将脚本echo
中两个语句后面的行RealTimeSync_kill_suspend.sh
以及子脚本echo
中两个语句后面的行删除RealTimeSync_resume.sh
到日志文件中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
但是当我查找该过程时,ps -aux | grep RealTimeSync
它没有显示任何适当的匹配,只是:
bart 31262 0.0 0.0 12252 2612 pts/0 S+ 17:38 0:00 grep --color=auto RealTimeSync
当我使用 运行子脚本时,sh /home/bart/Applications/FreeFileSync/RealTimeSync_resume.sh
我得到了正确的运行过程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
所有提到的文件都有-rwxr-xr-x
权限。
在论坛中搜索后,我发现 RealTimeSync 需要一些在登录时激活的服务,但该服务不可用,例如,在运行启动 synclients 的脚本时遇到问题的人需要连接到 X 服务器:
declare -x DISPLAY=":0.0"
declare -x XAUTHORITY="/home/<your user>/.Xauthority"
synclient VertEdgeScroll=1 VertTwoFingerScroll=1 HorizTwoFingerScroll=1 HorizEdgeScroll=1
来自该论坛主题:https://ubuntuforums.org/showthread.php?t=2380045
如能得到任何帮助我将非常感激。
编辑1
我发现“FreeFileSync 和 ReadTimeSync 需要访问图形 X11 显示,因此它们不能通过系统模式运行。在用户模式下,systemd 知道用户图形会话并使用它。”因此可能有两种解决方案:
上述任何一种,硬编码DISPLAY
和XAUTHORITY
,都不鼓励,因为 DISPLAY 值可能在不同会话之间有所不同。
或者作为用户服务运行,而不是系统服务,因为显示是为用户初始化的。
我在这里找到了这个,对运行 FreeFileSync 作为系统服务进行故障排除:https://unix.stackexchange.com/questions/529115/system-service-error-unable-to-initialize-gtk-is-display-set-properly
不幸的是我在实施这些解决方案时遇到了问题,如能得到任何帮助我将不胜感激。
编辑2
好的,我成功了!我现在从主脚本运行 RealTimeSync,虽然我猜这没什么区别,但重要的是按如下方式初始化“DISPLAY”:
#!/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
并将该脚本的所有者设置为root:chown root:root <script_name>
解决方案来自这里:以登录用户(非 root)身份恢复后启动脚本
据我所知,这只是一种变通方法,而不是正确的解决方案,因为硬编码DISPLAY
可能会带来问题,但暂时有效。如果有人知道如何以非 root 用户身份正确运行此程序,我将不胜感激。