systemdの起動スクリプトを書く方法


233

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

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

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

回答:


332

これを行うには、主に2つのアプローチがあります。

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

したがって、スクリプトと.serviceファイル(ユニット構成ファイル)の2つのファイルが必要です。
スクリプトが実行可能であり、最初の行(shebang)がであることを確認してください#!/bin/sh。次に、.serviceファイルを作成します/etc/systemd/system(プレーンテキストファイル、それを呼び出しましょうvgaoff.service)。
例えば:

  1. スクリプト: /usr/bin/vgaoff
  2. ユニットファイル: /etc/systemd/system/vgaoff.service

次に、ユニットファイルを編集します。その内容は、スクリプトの動作に依存します。

vgaoffGPUの電源を切るだけの場合、たとえば:

exec blah-blah pwrOFF etc 

の内容はvgaoff.service次のとおりです。

[Unit]
Description=Power-off gpu

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

[Install]
WantedBy=multi-user.target

vgaoffGPUの電源をオフにし、また電源をオンにするために使用される場合、たとえば:

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サービス終了コードとステータス情報の説明


詳細な回答をありがとう。スクリプトは"> / SYS /カーネル/デバッグ/ vgaswitcheroo /スイッチOFFエコー"一つのコマンドが含まれています
Sharique

次のメッセージで失敗しますvgaoff.service-Power-off gpu Loaded:loaded(/usr/lib/systemd/system/vgaoff.service; enabled)Active:failed(Result:exit-code)since Tue、11 Sep 2012 23: 46:46 +0530; 30秒前プロセス:5258 ExecStart = / usr / lib / systemd / scripts / vgaoff(code = exited、status = 203 / EXEC)CGroup:name = systemd:/system/vgaoff.service
Sharique

おっと、再び、私はこの小さなことを見逃した、それはうまく働いている..再びありがとう。
シャリケ

5
@Bazon-この論理によると、このサイトでの何千もの回答は、経験の浅いユーザーにとっての「潜在的なtrap」です。何をするのかecho SOMETHING > /some/file(または実際のところ他のコマンド)を知らない/完全に理解していない人は、システムで何かを実行しようとする前にCLIの基本を理解する必要があります。それ以外に、参考までに、いくつかのラップトップモデルでdGPUをオフにする方法を読んで、そこで使用されているコマンドをあなたが提案したようなものに置き換えることができるかどうかを確認してください。また、元のファイルを復元するには、通常、それを所有するパッケージを再インストールします。
-don_crissti

4
@don_crisstiおっと!先端をありがとう。(誤解を招く情報の伝播を避けるために元のコメントを削除しました。)
ウッドロウバーロウ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.