Как написать скрипт запуска для systemd

233

У меня на ноутбуке 2 видеокарты. Один - IGP, а другой - дискретный.

Я написал сценарий оболочки, чтобы отключить дискретную видеокарту.

Как я могу преобразовать его в сценарий systemd, чтобы запустить его при запуске?

Sharique
источник

Ответы:

332

Есть в основном два подхода для этого:

  • Если вам нужно запустить скрипт, вы не конвертируете его, а запускаете скрипт через systemdсервис.

Поэтому вам нужны два файла: сценарий и .serviceфайл (файл конфигурации модуля).
Убедитесь, что ваш скрипт исполняемый и первая строка ( шебанг ) - это #!/bin/sh. Затем создайте .serviceфайл в /etc/systemd/system(простой текстовый файл, давайте назовем его vgaoff.service).
Например:

  1. сценарий: /usr/bin/vgaoff
  2. файл модуля: /etc/systemd/system/vgaoff.service

Теперь отредактируйте файл модуля. Его содержание зависит от того, как работает ваш скрипт:

Если vgaoffпросто отключить графический процессор, например:

exec blah-blah pwrOFF etc 

тогда содержание vgaoff.serviceдолжно быть:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/usr/bin/vgaoff

[Install]
WantedBy=multi-user.target

Если vgaoffиспользуется для выключения графического процессора, а также для его повторного включения, например:

start() {
  exec blah-blah pwrOFF etc
}

stop() {
  exec blah-blah pwrON etc
}

case $1 in
  start|stop) "$1" ;;
esac

тогда содержание vgaoff.serviceдолжно быть:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/usr/bin/vgaoff start
ExecStop=/usr/bin/vgaoff stop
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
  • В большинстве тривиальных случаев вы можете обойтись без сценария и выполнить определенную команду напрямую:

Чтобы выключить:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo OFF > /whatever/vga_pwr_gadget/switch"

[Install]
WantedBy=multi-user.target

Чтобы выключить и включить:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo OFF > /whatever/vga_pwr_gadget/switch"
ExecStop=/bin/sh -c "echo ON > /whatever/vga_pwr_gadget/switch"
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Как только вы закончите с файлами, включите сервис:

systemctl enable vgaoff.service

Это начнется автоматически при следующей загрузке. Вы даже можете включить и запустить сервис за один раз с

systemctl enable --now vgaoff.service

с systemd v.220(на старых установках вам придется запускать его вручную).
Для более подробной информации смотрите systemd.serviceстраницу руководства.


Поиск и устранение неисправностей .
Начните здесь:
Как посмотреть полный журнал systemdсервиса?
systemdкоды выхода службы и объяснение информации о состоянии

don_crissti
источник
Спасибо за подробный ответ. Скрипт содержит одну команду "echo OFF> / sys / kernel / debug / vgaswitcheroo / switch"
Sharique,
происходит сбой со следующим сообщением vgaoff.service - gpu при отключении питания Загружен: загружен (/usr/lib/systemd/system/vgaoff.service; включен) Активен: не выполнен (Result: exit-code) со вторника, 11 сентября 2012 г. 23: 46:46 +0530; 30 с. Назад Процесс: 5258 ExecStart = / usr / lib / systemd / scripts / vgaoff (код = выход, статус = 203 / EXEC) CGroup: name = systemd: /system/vgaoff.service
Sharique,
ой, не снова, я пропустил эту маленькую вещь, она работает нормально .. еще раз спасибо.
Шарик
5
@Bazon - согласно этой логике, тысячи ответов на этом сайте являются «потенциальными ловушками» для неопытных пользователей. Люди, которые не знают / полностью не понимают, что echo SOMETHING > /some/fileделает (или любая другая команда на самом деле), должны ознакомиться с основами CLI, прежде чем пытаться запускать что-то на своих системах. Кроме того, FYI, прочитайте, как отключить dGPU на нескольких моделях ноутбуков, посмотрите, можно ли заменить используемые там команды чем-то, что вы предлагаете. Также для восстановления исходного файла вы обычно переустанавливаете пакет, которому он принадлежит.
don_crissti
4
@don_crissti упс! Спасибо за чаевые. (удалил мой оригинальный комментарий, чтобы избежать распространения вводящей в заблуждение информации.)
Вудроу Барлоу