1

Итак, у меня есть служба 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 возвращает «готово!"и правильно меняет настройки. Когда я запускаю 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

(Это все после того, как Х начал)

Какая разница? Почему это происходит?

1 ответ1

1

Разница между запуском скрипта через systemd и его непосредственным выполнением напрямую зависит от среды. Вы можете проверить это так. В вашем модульном файле добавьте это в раздел [Service] для тестирования:

StandardOutput=console

Затем в вашем bash-скрипте вверху добавьте эту строку, чтобы вывести окружение:

env

Теперь запустите скрипт внутри и вне systemd и сравните переменные окружения, которые выводятся.

Особенностью systemd является то, что он жестко контролирует среду. Это одновременно повышает безопасность и обеспечивает согласованность.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .