У меня есть новая служба systemd, которая не запускается с ошибкой "отказано в разрешении". Я купил Thinkpad L480. К сожалению, похоже, что ядро не может обнаружить тачпад. Это здесь может быть решено путем
sudo sh -c 'echo -n "elantech" > /sys/bus/serio/devices/serio1/protocol'
Поскольку я не хочу делать это при каждом запуске, я создал службу systemd, которая работает не так, как ожидалось.
Мой touchpad_enabler.service является
[Unit]
Description=FooBar
[Service]
Type=oneshot
ExecStart=/usr/local/bin/enable_touchpad.sh
[Install]
WantedBy=default.target
Файл сценария просто
#!/bin/bash
echo -n "elantech" > /sys/bus/serio/devices/serio1/protocol
Но я также попробовал это с версией sh -c
. Я настроил разрешения через
sudo chmod 744 /usr/local/bin/enable_touchpad.sh
sudo chmod 644 /etc/systemd/system/touchpad_enabler.service
поэтому оба файла принадлежат пользователю root. Затем я включил его через
systemctl enable enable_touchpad.sh
Когда я вручную запускаю сервис через systemctl start touchpad_enabler.service
, он работает совершенно нормально, и тачпад работает как надо. Однако при запуске служба завершается сбоем и указывается как « сбойная » в systemctl list-units
.
Выходные данные journalctl -b -u touchpad_enabler.service
:
systemd[1]: Starting Solves bug that Thinkpad L480 Touchpad is not correctly detected...
enable_touchpad.sh[516]: sh: /sys/bus/serio/devices/serio1/protocol: permission denied
systemd[1]: touchpad_enabler.service: Main process exited, code=exited, status=1/FAILURE
systemd[1]: touchpad_enabler.service: Failed with result 'exit-code'.
systemd[1]: Failed to start FooBar
Похоже, проблема в разрешении на запись в сам файл. Но запуск службы вручную работает нормально, и, насколько я понимаю, systemd в любом случае должен выполнить команду от имени пользователя root, верно?
Из чтения man systemctl.service
меня возникла идея добавить «+» к пути к файлу, чтобы он читал
ExecStart=+/usr/local/bin/enable_touchpad.sh
Без эффекта.
Я не очень понимаю, откуда этот файл protocol
. Похоже, он создается ядром при запуске? Поэтому я также экспериментировал с параметром After=
, но systemd должен запускать службы после полной загрузки ядра, верно? Файл также принадлежит пользователю root, поэтому я не ожидаю никаких проблем.
Я надеюсь, что кто-то может помочь мне. Заранее спасибо.