【systemd】Jetsonで起動時に自動でファンを回す

2020.08.18

カフェチームの山本です。

現在カフェでは、Jetson Xavier NXを利用しています。処理性能が高く重宝しているのですが、かなり発熱するため、ファンを回した状態で処理を実行する必要があります。実際に店舗(カフェ)で利用する際は、プログラムの起動は手作業ではなく自動で行う必要があるため、ファンの起動も自動で行う必要があります。

今回は、ファンの起動を自動化するため、Linuxのsystemdという仕組みを利用して、OS起動時にスクリプトを実行するように設定しました。ちょっと調べるのに時間がかかったため、備忘録も兼ねて記事にしました。

実行したい内容

Jetsonでファンを回すには、通常以下のようなコマンドを実行します。

sudo sh -c 'echo 255 > /sys/devices/pwm-fan/target_pwm'

/sys/devices/pwm-fan/target_pwmにアクセスするには、sudoで実行する必要があり、手入力でパスワードを入力します。

これを起動時に自動的に実行されるようにします。

登録手順

ステップ1:実行スクリプトを作成する

以下のような、実行用スクリプトを作成します。systemdで登録する場合、sudoコマンドを書く必要はありません(書いても動きます)。

  • /home/yamahiro/run_fan.sh
sh -c 'echo 255 > sys/devices/pwm-fan/target_pwm'

今回のように1行程度のコマンドであれば、そのままServiceファイル(ステップ2で後述)に書いても良いかも知れませんが、長いコマンドを実行する場合も考えると、スクリプトファイルにまとめたほうが良いでしょう。

ステップ2:Service登録用のファイルを作成する

systemdにUnitとして登録するための設定ファイルを作成します。

nano run_fan.service
  • Service登録用のデータ:run_fan.service
[Unit]
Description=start running Jetson's fan at max speed

[Service]
WorkingDirectory=/home/yamahiro
ExecStart=/bin/sh run_fan.sh

[Install]
WantedBy=default.target

設定項目の意味はそれぞれ以下のようです。

  • [Unit] Description:Serviceの説明(テキスト形式、任意の長さ)
  • [Service] WorkingDirectory:Serviceを実行する作業ディレクトリ
  • [Service] ExecStart:Service起動時に実行するコマンド。最初コマンドは絶対パスで記述する必要があります。shのみにすると、Service実行時にエラーになります。
  • [Install] WantedBy:Service間の依存関係。default.target(デフォルトで起動するようにsystemdに設定されているUnit)を指定することで、systemdの起動時に登録したサービスを起動するように設定できます。

ステップ3:Serviceを有効化する

作成したスクリプトをsystemdのフォルダ(/etc/systemd/system/)に移動します。

sudo mv run_fan.service /etc/systemd/system/

移動したファイルを指定して、Serviceをsystemdに登録します。

systemctl enable run_fan

これによって、OSを起動した際に、ステップ2のServiceが起動され、ステップ1のスクリプトが実行されるようになります。

(ステップ4:動作を確認する)

もし、再起動することなく動作を確認したい場合、以下のコマンドを実行して起動することができます。

systemctl start run_fan

まとめ

JetsonでOSを起動した際にファンを自動で回すために、systemdによってServiceを起動する方法をまとめしました。ご参考になれば幸いです。

参考にさせていただいたページ

これからSystemd入門する - Qiita

Systemd入門(1) - Unitの概念を理解する - めもめも

Systemd入門(4) - serviceタイプUnitの設定ファイル - めもめも