Shell-Script

如何為 Systemd 編寫啟動腳本?

  • January 23, 2022

我的筆記型電腦上有 2 個顯卡。一個是IGP,另一個是離散的。

我編寫了一個 shell 腳本來關閉獨立顯卡。

如何將其轉換為 systemd 腳本以在啟動時執行它?

主要有兩種方法可以做到這一點:

帶腳本

如果您必須執行腳本,則不要轉換它,而是通過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

Ifvgaoff用於關閉 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手冊頁。

故障排除

引用自:https://unix.stackexchange.com/questions/47695