Как избежать пробелов в системных файлах 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: -
Я не могу удалить пробелы из имени файла, так как служба, которую я пытаюсь запустить, по какой-то причине требует их.
Куда я иду не так?
3 ответа
Правильный способ генерации путей в systemd - использовать systemd-escape.
т.е.
~$ systemd-escape --path "/home/cobra/my service/start.sh"
home-cobra-my\x20service-start.sh
да /
заменяется -
Очевидное, что нужно сделать, это использовать двойные кавычки.
ExecStart="/home/cobra/my service/start.sh"
Вы также должны избавиться от скрипта start.sh и переместить всю необходимую логику в модуль.
Для пробелов в ExecStart есть открытый отчет об ошибках.[1] Обходной путь должен использовать /usr/bin/env
затем путь в кавычках. Пример:
ExecStart=/usr/bin/env "/path/with spaces/executable"
Каноническое, но не очень хорошее решение заключается в использовании systemd-escape
,
systemd-escape --path "/path/with spaces/executable"