Подстановка процесса создает трубу, использует
/dev/fd
для указания пути, эквивалентного дескриптору файла, в котором находится труба, и передает имя файла в качестве аргумента программе. Здесь программа - sudo
, и она передает этот аргумент (который является просто строкой, насколько это возможно) программе wpa_supplicant
, которая рассматривает его как имя файла.
Проблема в том, что sudo закрывает все дескрипторы файлов, кроме стандартных (stdin=0, stdout=1 и stderr=2). Труба подстановки процесса находится на другом дескрипторе, который закрывается, поэтому когда wpa_supplicant
пытается открыть его, он находит несуществующий файл.
Если ваша политика sudo позволяет это (включена опция closefrom_override
), вы можете запретить закрывать файловые дескрипторы. Но обычно это не так.
sudo -C 64 wpa_supplicant … -c <(wpa_passphrase …)
В качестве альтернативы, поскольку вы не используете стандартный ввод, передайте данные туда.
wpa_passphrase … | sudo wpa_supplicant … -c /dev/stdin
Или же запустите shell из sudo и поместите туда подстановку процесса. Будьте осторожны с кавычками, если команда содержит специальные символы.
sudo bash -c 'wpa_supplication … -c <(wpa_passphrase …)'
К сожалению, этот файл, который у вас есть, на самом деле является сценарием оболочки. В прошлом большинство систем / сценариев инициализации интерпретировали файлы, которые предоставляют переменные среды, используя оболочку, так что вы могли уйти от работы с оболочкой в них. Однако Systemd этого не делает. Файл среды - это действительно файл среды, а не скрипт. Это описано в systemd.exec
странице руководства :
Расширение переменной не выполняется внутри строк, однако расширение спецификатора возможно.Символ $ не имеет особого значения.
Следовательно, у вас есть 2 варианта.
Раскройте все свои переменные вручную. Значение использования CATALINA_BASE = / d01 / tomcat / prod / xyz / 1
.
Оцените файл с помощью оболочки:
ExecStart = / bin / bash -ac '. / путь / к / env_file; exec / path / to / program '
Нужно ли сделать одно длинное трудночитаемое заявление?
Нет
Строка, заканчивающаяся обратной косой чертой, будет объединена со следующей, что позволит определять многострочные переменные.
Вы можете использовать bash для расширения ваших переменных.
Файл среды:
BLA=bla
BLABLA=${BLA}${BLA}
Используйте bash -c
для выполнения команды:
ExecStart=/usr/bin/bash -c 'echo ${BLA} .. ${BLABLA}'
Вывод:
bash[4771]: bla .. blabla
В конкретном случае Tomcat (, как и в этом вопросе ), я обнаружил, что проще поместить большинство этих настроек в bin/setenv.sh
, который выполняется Tomcat при запуске и оценивает переменные в сценарий оболочки, как и ожидалось.
Итак, в /etc/systemd/system/tomcat.service
я указываю переменные Environment
только для CATALINA_BASE
и CATALINA_HOME
, а затем помещаю все остальное в ${CATALINA_BASE}/bin/setenv.sh
.
Другой вариант :Иметь дополнительный модуль, который запускается перед этим и создает EnvironmentFile
, который он может использовать:https://stackoverflow.com/a/42841480/32453
Второстепенное устройство может, например, использовать bash. Кажется, это systemd
способ импорта env. :|