【问题标题】:How to execute this command in systemd servicefile?如何在 systemd 服务文件中执行此命令?
【发布时间】:2021-08-27 17:53:49
【问题描述】:

好的,所以我有这个命令可以关闭我的触摸屏。当我在 root shell 中执行它时它可以工作。

所以这行得通:

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

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

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

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

但这也不起作用..可能是因为awk NR==1'{print $1}'part?我也试过用awk NR==1'\''{print $1}'\''替换它,但它再次失败了。

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

【问题讨论】:

    标签: service command-line-interface sh systemd


    【解决方案1】:

    首先,

    1. awk 命令的语法是错误的。引号放置不正确。 NR == 1 部分是 awk 命令的一部分,用于指示文件中的第一行记录,即
      awk NR==1'{print $1}'
      #  ^^^^^^^  should be within quotes
      awk 'NR == 1 { print $1 }'
      
    2. echols 和命令替换 $(..) 的序列看起来不正确。你实际上是echo-ing 文字字符串/sys/bus/hid/drivers/hid-multitouch(如果ls 在该路径找到文件)到管道,awk 只是将它写入/sys/bus/hid/drivers/hid-multitouch/unbind 文件,这可能不是你想要的操作.您只需要直接在文件上运行命令即可
      awk 'NR == 1 { print $1 }' /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?。至于直接在ExecStart中运行命令。除了使用/bin/sh 还使用路径/bin/awk

    因此,将它们放在一起并使用/bin/ 而不是/usr/bin,您可以在下面执行此操作。此命令使用 ".." 而不是 awk 脚本,需要对 $1 进行转义

    ExecStart=/bin/sh -c '/bin/awk "NR == 1 { print \$1 }" /sys/bus/hid/drivers/hid-multitouch > /sys/bus/hid/drivers/hid-multitouch/unbind'
    

    【讨论】:

    • 好的,我已经为您的广泛回答奖励了赏金,我感谢您!不过,它还不能精确地工作。我需要 ls 命令的原因是在/sys/bus/hid/drivers/hid-multitouch 中有一个目录,在每个系统启动时都有不同的名称。例如,系统启动后称为0018:04F3:262A.0001,重启后称为0018:04F3:262A.0002。但我需要将该目录的名称写入/sys/bus/hid/drivers/hid-multitouch/unbind。但我会试着摆弄你的解释,看看我能走多远。
    • 得到它的工作 thnx 您的回复!最后我需要放入服务文件的命令是ExecStart=/bin/sh -c '/bin/ls /sys/bus/hid/drivers/hid-multitouch | /bin/awk "NR == 1 {print \$1}" > /sys/bus/hid/drivers/hid-multitouch/unbind'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    相关资源
    最近更新 更多