web-dev-qa-db-ja.com

systemdの起動スクリプトを作成する方法

私のラップトップには2つのグラフィックカードがあります。 1つはIGPで、もう1つはディスクリートです。

ディスクリートグラフィックカードをオフにするシェルスクリプトを作成しました。

これをsystemdスクリプトに変換して起動時に実行するにはどうすればよいですか?

236
Sharique

それには主に2つの方法があります。

  • スクリプトを実行する必要がある場合は、スクリプトを変換するのではなく、systemdサービスを介してスクリプトを実行します。

したがって、スクリプトと.serviceファイル(ユニット構成ファイル)の2つのファイルが必要です。
スクリプトが実行可能であり、最初の行(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サービス終了コードとステータス情報の説明

340
don_crissti