如何在 systemd 唤醒后运行用户脚本?

如何在 systemd 唤醒后运行用户脚本?

当我的 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/394818superuser.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) 中。

相关内容