每次我启动系统时我都会输入
# 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.target
和After=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
,请将其设为ExecStop
for 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.target
和sleep.target
。显然,您应该使用您实际关心的任何目标,但您可能只是在寻找suspend.target
.