You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在systemd服务配置文件中执行关闭触摸屏的Shell命令

问题原因

systemd 的 ExecStart 字段默认不支持 shell 语法特性:包括 $() 命令替换、管道符、重定向符等,直接编写会被当做字面量参数传递给命令,这是第一次配置不生效的核心原因。

后续用 sh -c 封装时出现了引号嵌套冲突、变量提前展开的问题:用双引号包裹命令内容时,$() 会在 systemd 解析配置阶段就被展开,而非在 sh 执行时动态获取设备ID,同时 awk 语句的单引号和外层引号冲突导致命令解析失败。

解决方案

方案1:直接修正 ExecStart 转义写法

完整的 touchscreen.service 配置如下:

[Unit]
Description=Disable touchscreen on system boot
After=sysfs.target

[Service]
Type=oneshot
User=root
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'

[Install]
WantedBy=multi-user.target

这里用单引号包裹 sh -c 的全部命令内容,awk 语句的单引号通过 '\'' 做转义,避免引号冲突,同时保证命令替换逻辑在 sh 执行阶段才运行。

方案2:独立脚本封装(更稳定、易调试)

这种方式避免复杂转义处理,后续排查问题更方便:

  1. 新建脚本文件 /usr/local/bin/disable-touchscreen.sh,内容如下:
#!/bin/sh
TOUCH_DEV=$(ls /sys/bus/hid/drivers/hid-multitouch | awk 'NR==1{print $1}')
/usr/bin/echo "$TOUCH_DEV" > /sys/bus/hid/drivers/hid-multitouch/unbind
  1. 给脚本添加执行权限:
chmod +x /usr/local/bin/disable-touchscreen.sh
  1. 调整 touchscreen.service 的 ExecStart 字段为:
ExecStart=/usr/local/bin/disable-touchscreen.sh

生效验证

修改完服务配置后执行以下命令测试:

# 重载systemd配置
systemctl daemon-reload
# 手动运行服务测试效果
systemctl start touchscreen.service
# 确认服务运行状态
systemctl status touchscreen.service
# 测试无问题后设置开机自启
systemctl enable touchscreen.service

内容的提问来源于stack exchange,提问作者Montmons

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:45:03