Итак, у меня есть служба systemd, которая называется startup.service:
[Unit]
Description=startup scripts
[Service]
Type=oneshot
ExecStart=/home/user/Documents/Tools/Scripts/startup.sh
[Install]
WantedBy=multi-user.target
который вызывает скрипт с именем startup.sh:
#! /bin/sh -
DIR='/home/user/Documents/Tools/Scripts'
$DIR/audio.sh
$DIR/powertop.sh
$DIR/xinput.sh
который вызывает скрипт с именем xinput.sh:
экспорт DISPLAY =: 0.0 если xinput set-prop 11 297 -107 -107; затем эхо "сделано!" фи
Когда я запускаю startup.sh от имени пользователя root, xinput.sh возвращает «done!» и правильно меняет настройки. Когда я запускаю startup.service от имени пользователя root, xinput завершается ошибкой и возвращает:
Jun 23 22:37:45 localhost startup.sh[7051]: No protocol specified
Jun 23 22:37:45 localhost startup.sh[7051]: Unable to connect to X server
(Это все после того, как Х начал)
Какая разница? Почему это происходит?
Ответы:
Разница между запуском скрипта через
systemd
и его непосредственное управление - это среда. Вы можете проверить это так. В вашем модульном файле добавьте это в раздел [Service] для тестирования:Затем в вашем bash-скрипте вверху добавьте эту строку, чтобы вывести окружение:
Теперь запустите скрипт внутри и вне systemd и сравните переменные окружения, которые выводятся.
Особенностью systemd является то, что он жестко контролирует среду. Это одновременно повышает безопасность и обеспечивает согласованность.
источник