如何在 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 服务运行?
首先,
awk
命令的语法是错误的。引号放置不正确。 NR == 1
部分是awk
命令的一部分,表示文件中的第一行记录,即
awk NR==1'{print }'
# ^^^^^^^ should be within quotes
awk 'NR == 1 { print }'
- 您的
echo
、ls
和命令替换 $(..)
的顺序看起来不正确。您实际上是 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
- 既然
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'
好的,所以我有关闭触摸屏的命令。当我在根 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 服务运行?
首先,
awk
命令的语法是错误的。引号放置不正确。NR == 1
部分是awk
命令的一部分,表示文件中的第一行记录,即awk NR==1'{print }' # ^^^^^^^ should be within quotes awk 'NR == 1 { print }'
- 您的
echo
、ls
和命令替换$(..)
的顺序看起来不正确。您实际上是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
- 既然
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'