如何在关机时执行 wmctrl -l 脚本?

如何在关机时执行 wmctrl -l 脚本?

系统: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

相关内容