编写用于挂起/恢复的 systemd 单元文件

编写用于挂起/恢复的 systemd 单元文件

每次我启动系统时我都会输入

# su
Password:
# hciattach -s 152000 /dev/ttyS1 billionton

这是初始化我的 BT 鼠标所需要的,从挂起恢复后我必须输入以下内容:

# su
Password:

寻找 hciattach PID 并杀死它

# pkill hciattach
# hciattach -s 152000 /dev/ttyS1 billionton

现在我已经编写了两个脚本

# cat bt-mouse-suspend.service 
[Unit]
Description=BT Mouse suspend helper
Before=sleep.target

[Service]
Type=simple
ExecStart=-/usr/bin/pkill hciattach

[Install]
WantedBy=sleep.target

# cat bt-mouse-resume.service 
[Unit]
Description=BT Mouse resume helper
After=suspend.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/hciattach -s 152000 /dev/ttyS1 billionton

[Install]
WantedBy=suspend.target
# systemctl status bt-mouse-resume
● bt-mouse-resume.service - BT Mouse resume helper
   Loaded: loaded (/etc/systemd/system/bt-mouse-resume.service; enabled; vendor preset: disabled)
   Active: active (exited) since Mon 2017-04-03 22:09:50 EEST; 12min ago
 Main PID: 6386 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 4915)
   CGroup: /system.slice/bt-mouse-resume.service

apr   03 22:09:50 Twinh systemd[1]: Started BT Mouse resume helper.
apr   03 22:09:51 Twinh hciattach[6386]: Device setup complete
# pgrep hciattach
#

挂起脚本运行良好并杀死了预期的内容。但简历 hciattach 一旦执行后就消失了。

答案1

您混淆了After所指的内容,After将导致服务在启​​动之前等待另一个单元。你Wanted-By=suspend.targetAfter=suspend.target你是互相矛盾的。

正在Wanted-By声明这bt-mouse-resume.service是 的一部分suspend.target,但是正在After声明bt-mouse-resume.service应该等到suspend.target完成。服务不应成为目标的一部分,并在启动之前等待该目标。这也意味着您将服务配置为在suspend.target启动时运行,而不是在退出时运行。

您真正寻找的是一种在停止时运行某些内容的方法suspend.target,因此我将向您指出以下内容的一个非常重要的部分systemd

请注意,当两个具有顺序依赖性的单元被关闭时,将应用启动顺序的相反顺序。

参考

所以你说你的bt-mouse-suspend.service工作正常。因为它Wanted-By=sleep.target,当sleep.target启动时你的服务就会运行。反之,当sleep.target停止时bt-mouse-suspend.service也会停止。您不应该需要Before此服务中的字段,您已经使您的服务成为该目标的操作。

因此,如果您想/usr/bin/hciattach -s 152000 /dev/ttyS1 billionton在离开时运行sleep.target,请将其设为ExecStopfor bt-mouse-suspend.service

我还建议进一步阅读有关如何systemd工作的内容,即看看:

https://www.freedesktop.org/software/systemd/man/systemd.service.html#

https://www.freedesktop.org/software/systemd/man/systemd.unit.html#

https://www.freedesktop.org/software/systemd/man/systemd.target.html#

此外,您的两项服务目标为suspend.targetsleep.target。显然,您应该使用您实际关心的任何目标,但您可能只是在寻找suspend.target.

相关内容