Як написати сценарій запуску для systemd


233

У мене на ноутбуці є 2 відеокарти. Один - IGP, а інший - дискретний.

Я написав сценарій оболонки, щоб вимкнути дискретну відеокарту.

Як я можу конвертувати його в системний скрипт, щоб запустити його при запуску?

Відповіді:


332

Для цього є переважно два підходи:

  • Якщо вам доведеться запустити скрипт, ви не конвертуєте його, а скоріше запустіть його через systemdсервіс.

Тому вам потрібні два файли: скрипт і .serviceфайл (файл конфігурації блоку).
Переконайтеся, що ваш сценарій виконується, і перший рядок ( shebang ) #!/bin/sh. Потім створіть .serviceфайл у /etc/systemd/system(звичайний текстовий файл, назвемо його vgaoff.service).
Наприклад:

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

Тепер відредагуйте файл одиниці. Його зміст залежить від того, як працює ваш сценарій:

Якщо vgaoffпросто вимкнути gpu, наприклад:

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використовується для вимкнення GPU, а також для його включення, наприклад:

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коди виходу служби та пояснення інформації про стан


Дякую за детальну відповідь. Сценарій містить одну команду "echo OFF> / sys / kernel / debug / vgaswitcheroo / switch"
Sharique

воно не вдається з наступним повідомленням vgaoff.service - Вимкнення gpu Завантажено: завантажено (/usr/lib/systemd/system/vgaoff.service; увімкнено) Активне: не вдалося (Результат: код виходу) з вторника, 11 вересня 2012 23: 46:46 +0530; 30 років тому Процес: 5258 ExecStart = / usr / lib / systemd / scriptpts / vgaoff (код = вийшов, статус = 203 / EXEC) CGroup: name = systemd: /system/vgaoff.service
Sharique

ой, не знову, я пропустив цю дрібницю, вона працює чудово .. ще раз дякую.
Шарік

5
@Bazon - за цією логікою тисячі відповідей на цьому сайті - це "потенційні пастки" для недосвідчених користувачів. Люди, які не знають / повністю розуміють, що echo SOMETHING > /some/fileробить (чи будь-яка інша команда насправді), повинні ознайомитися з основами CLI, перш ніж намагатися запускати матеріали в своїх системах. Окрім цього, FYI, прочитайте, як вимкнути dGPU на декількох моделях ноутбуків, подивіться, чи можна замінити команди, які використовуються там, чимось таким, як ви пропонуєте. Крім того, для відновлення вихідного файлу ви зазвичай перевстановлюєте пакет, який йому належить.
don_crissti

4
@don_crissti whoops! дякую за пораду. (видалено мій оригінальний коментар, щоб уникнути поширення оманливої ​​інформації.)
Вудро Барлоу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.