如何转义 systemd 单元文件中的空格?

如何转义 systemd 单元文件中的空格?

我的单元文件看起来像这样(已经尝试转义空格,如\x20文档所述):

[Unit]
Description=My Service

[Service]
Type=simple
WorkingDirectory=/home/cobra/my\x20service/
ExecStart=/home/cobra/my\x20service/start.sh

[Install]
WantedBy=multi-user.target

但是当尝试启动它时,它会失败并显示以下消息:

Failed at step CHDIR spawning /home/cobra/my service/start.sh: No such file or directory
myservice.service: main process exited, code=exited, status=200/CHDIR

给出从该错误消息到返回的路径stat

  File: ‘/home/cobra/my service/start.sh’
  Size: 280             Blocks: 8          IO Block: 4096   regular file
Device: 903h/2307d      Inode: 4718912     Links: 1
Access: (0754/-rwxr-xr--)  Uid: ( 1000/   cobra)   Gid: ( 1000/   cobra)
Access: 2015-05-24 22:42:12.702657594 +0200
Modify: 2015-03-27 22:28:05.682531000 +0100
Change: 2015-05-24 22:40:58.830298787 +0200
 Birth: -

我无法从文件名中删除空格,因为我尝试运行的服务由于某种原因需要它们。

我哪里做错了?

答案1

在 systemd 中生成路径的正确方法是使用 systemd-escape。

IE

~$ systemd-escape --path "/home/cobra/my service/start.sh"
home-cobra-my\x20service-start.sh

Yes/被替换为-

答案2

显而易见的做法是使用双引号。

ExecStart="/home/cobra/my service/start.sh"

您还应该摆脱start.sh脚本并将任何必要的逻辑移入单元。

答案3

对于 ExecStart 中的空格,有一个未解决的错误报告。[1] 解决方法是使用 ,/usr/bin/env后跟引号中的路径。例如:

ExecStart=/usr/bin/env "/path/with spaces/executable"

规范的(但不太好的)解决方案是使用systemd-escape

systemd-escape --path "/path/with spaces/executable"

[1]https://github.com/systemd/systemd/issues/2132

相关内容