当我的 debian jessie 桌面盒子从睡眠中唤醒(通过新的闪亮的 systemd)时,我的鼠标设置将返回到默认值,并重置了我的自定义设置
xinput set-prop 12 'Device Accel Constant Deceleration' 2.5
当我登录时运行。
如何在唤醒时运行任意用户脚本?(假设用户是X会话的所有者)
据我所知,以下是我对设置所做的唯一自定义systemd
(是的,我知道这是完全错误的,因为它不适用于任意用户,但我还没有弄清楚如何做到这一点...这有点相关)
另外,作为当前使用 X 屏幕的用户,如何在唤醒之前运行任意用户脚本?
cat /etc/systemd/system/i3lock.service
#systemctl enable i3lock.service
[Unit]
Description=i3lock
Before=sleep.target
[Service]
User=fommil
Type=forking
Environment=DISPLAY=:0
ExecStart=/usr/bin/i3lock -c 000000
[Install]
WantedBy=sleep.target
答案1
这个答案是基于askubuntu.com/a/661747/394818(也如在评论通过@sun-bear),askubuntu.com/q/616272/394818和superuser.com/a/1269158/585953。
使用系统服务:
创建文件/etc/systemd/system/my_user_script.service
:
[Unit]
Description=Run my_user_script
After=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target
[Service]
ExecStart=/path/to/my_user_script
#User=my_user_name
#Environment=DISPLAY=:0
[Install]
WantedBy=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target
删除挂起/休眠/混合,以防服务只能在从特定类型的睡眠中唤醒后执行。如果服务需要由特定用户运行,请取消注释User=
和Environment=
行并替换相关用户名。
使用以下命令安装服务文件:
sudo systemctl enable my_user_script
使用用户服务将不起作用:
为了避免使用 来设置硬编码的用户名User=
,可以在 处创建完全相同的服务文件~/.config/systemd/user/my_user_script.service
并使用
systemctl --user enable my_user_script
然而,这是行不通的。 @grawity 更详细地解释在unix.stackexchange.com/a/174837/163108为什么会这样:
sleep.target
特定于系统服务。原因是,sleep.target
它不是一个在睡觉时自动激活的魔法目标。这只是一个常规目标看跌期权系统进入睡眠状态——因此“用户”实例当然不会有等效的实例。 (不幸的是,“用户”实例当前无法依赖系统范围的服务。)
答案2
我创建了一个文件/lib/systemd/system-sleep/
(您可以将其称为例如wakeup
):
#!/bin/sh
case $1 in
post)
/bin/runme
;;
esac
然后我设置可执行权限位。
# chmod +x /usr/lib/systemd/system-sleep/wakeup
唤醒时调用post
。
如需进一步阅读,请查看这里。
答案3
您还可以创建一个 systemd 单元文件:
# /etc/sysstemd/system/awake.service
# ExecStart is executed on wake up from 'sleep' (suspend or hibernate).
[Unit]
WantedBy=sleep.target
After=systemd-suspend.service systemd-hybrid-sleep.service systemd-hibernate.service
[Service]
Type=simple
ExecStart=/bin/bash -c 'echo awake from sleep' >> /tmp/awake.notes'
通常这将用于重新启动 systemd 服务。
ExecStart=/bin/systemctl restart fancontrol
答案4
所有以前的解决方案都没有提供实际启动的方法用户唤醒后的单位。您可能想使用用户单位,因为您在那里导入了环境变量(例如使用dbus-update-activation-environment --all --systemd
)。
我只能找到一个丑陋的解决方案来解决这个问题,其中涉及创建一个启动用户服务的系统服务:
创建系统服务:/etc/systemd/system/[email protected]
[Unit]
Description=Run user unit of %i after wakeup.
After=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl --user --machine=%i@ start --wait afterwakeup.service
[Install]
WantedBy=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target
灵感来自https://unix.stackexchange.com/a/713646/454143。
及用户单位~/.config/systemd/user/afterwakeup.service
:
[Unit]
Description=Runs after wakeup from suspend etc.
[Service]
ExecStart=<do anything you want here, dont forget to import your environment>
Type=oneshot
现在运行systemctl enable afterwakeup@<youruser>.service
,不要忘记导入您的用户环境,例如在 .xinitrc ( dbus-update-activation-environment --all --systemd
) 中。