如何在 systemd 服务文件中执行此命令?

How to execute this command in systemd servicefile?

好的,所以我有关闭触摸屏的命令。当我在根 shell.

中执行它时它起作用

所以这有效:

sudo su
/usr/bin/echo $(ls /sys/bus/hid/drivers/hid-multitouch | awk NR==1'{print }') > /sys/bus/hid/drivers/hid-multitouch/unbind

然后我的触摸屏停止工作,这是我想要的结果。

现在我想制作一个 touchscreen.service 文件来在每次启动时执行它。所以在服务文件中我包括:

ExecStart=/usr/bin/echo $(ls /sys/bus/hid/drivers/hid-multitouch | awk NR==1'{print }') > /sys/bus/hid/drivers/hid-multitouch/unbind

但是它不起作用 > 也没有抛出我能够捕获的任何错误。

我确实从早期对 .service 文件的摆弄中知道我可能实际上需要使用 /usr/bin/sh -c,所以我也尝试过:

ExecStart=/usr/bin/sh -c "/usr/bin/echo $(ls /sys/bus/hid/drivers/hid-multitouch | awk NR==1'{print }') > /sys/bus/hid/drivers/hid-multitouch/unbind"

然而这也不起作用.. 可能是因为 awk NR==1'{print }' 部分?我也试过用 awk NR==1'\''{print }'\'' 替换它,但还是失败了。

有没有人知道如何让在我的 root cli 环境中运行的命令也作为 systemd 服务运行?

首先,

  1. awk 命令的语法是错误的。引号放置不正确。 NR == 1部分是awk命令的一部分,表示文件中的第一行记录,即
    awk NR==1'{print }'
    #  ^^^^^^^  should be within quotes
    awk 'NR == 1 { print  }'
    
  2. 您的 echols 和命令替换 $(..) 的顺序看起来不正确。您实际上是 echo-ing 文字字符串 /sys/bus/hid/drivers/hid-multitouch(如果 ls 在该路径找到文件)到管道并且 awk 只是将其写入 /sys/bus/hid/drivers/hid-multitouch/unbind 文件,这可能不是您想要的操作。您只需要直接对文件执行 运行 命令
    awk 'NR == 1 { print  }' /sys/bus/hid/drivers/hid-multitouch > /sys/bus/hid/drivers/hid-multitouch/unbind
    
  3. 既然 awk 命令已修复,您有两种选择 运行 上述命令作为 systemd 的一部分,要么将您的命令放在脚本中,要么 运行 直接命令。要将其放入脚本,请参考 Unix.SE 答案 Where do I put scripts executed by systemd units?。至于运行ning命令直接在ExecStart。除了使用 /bin/sh 还使用路径 /bin/awk

所以把它放在一起并使用 /bin/ 而不是 /usr/bin,你可以在下面做。此命令使用 ".." 而不是 awk 脚本,需要转义 </code></p> <pre><code>ExecStart=/bin/sh -c '/bin/awk "NR == 1 { print $1 }" /sys/bus/hid/drivers/hid-multitouch > /sys/bus/hid/drivers/hid-multitouch/unbind'