如何在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:独立脚本封装(更稳定、易调试)
这种方式避免复杂转义处理,后续排查问题更方便:
- 新建脚本文件
/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
- 给脚本添加执行权限:
chmod +x /usr/local/bin/disable-touchscreen.sh
- 调整
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
相关产品推荐
相关产品推荐

