系统:ubuntu 20
[Unit]
Description=Run Scripts at Start and Stop
[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=/home/user/same_test
[Install]
WantedBy=multi-user.target
相同测试:
#!/bin/sh
echo test >> home/user/same_test_echo.txt (works)
wmctrl -l >> /home/user/same_test.txt (don't work)
结果是:
- same_test.txt 为空(不起作用)
- same_test_echo.txt 包含测试(有效)
答案1
选项 1 - 检查 PATH
第一步是查看问题是否出在命令所在的位置:
$ type -a echo
echo is a shell builtin
echo is /bin/echo
$ type -a wmctrl
wmctrl is /usr/bin/wmctrl
该echo
命令内置于 shell 中,也位于/bin
目录中,该目录是程序最受欢迎的目录。
该wmctrl
命令位于/usr/bin
可能不属于 systemd 的目录中PATH
。
与这个问题非常相似:
解决方案是在 systemd 服务中添加一行:
[Service]
Environment=PATH=/home/someUser/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
另一种选择是在调用命令时对目录进行硬编码:/usr/bin/wmctrl
。
选项 2 -WantedBy=multi-user.target
笔记:对于那些人来说这是通用选项启动不适用于关闭就像 OP 所做的那样。
如果路径不是问题,下一步是检查WantedBy
选项:
那里的答案解释道:
请注意,Wants 或 WantedBy 仅表示系统应在启动另一项服务或目标时启动一项服务,但它并未指定启动/关闭顺序。如果您需要在服务 A 启动时服务 B 已在运行,则需要在 B.service 文件中添加 Before=A.service 以明确指定启动顺序依赖关系。
考虑到脚本运行时 GUI 可能尚未运行。因此没有可供wmctrl -l
报告的窗口。
如果这是问题After
(在启动期间),那么WantedBy
这是一个可能的解决方案。
选项 3 - 使用/bin/true
来自本问答中的评论:
代替:
RemainAfterExit=true
和:
RemainAfterExit=/bin/true
笔记: true
是一个 shell 内置命令和一个命令:
$ type -a true
true is a shell builtin
true is /bin/true