概要
以下の4つは、ラズベリーパイ起動時(CUI)に指定プログラムを自動実行させる代表的な方法
- /etc/rc.local
- .bashrc
- cron (crontab)
- systemd
1. /etc/rc.local
概要
起動プロセスの最後に1回だけ自動実行されるシェルスクリプトです。実行のタイミングは
- カーネルの読み込み
- systemd (または init) の開始
- 各種システムサービスの起動
- /etc/rc.local の実行
- ログイン画面の表示
記述例
”/etc/rc.local” に実行したいコマンドやスクリプトを記述するのですが、記述条件に
- #!/bin/bashで始まり、exit 0で終わる。
- 実行は上記の #!/bin/bash と exit 0 間に記述。
- パスはプルパスで指定
- "monitor.py" は Http_server を含み、カレントディレクトリを /home/ユーザー名/monitor/ としたい。
- -> "cd" でカレントディレクトリを /home/ユーザー名/monitor/ に移動
- "monitor.py" は GPIOアクセスを含み、ルート権限で実行したい。
- -> /etc/rc.local 自体が root権限で実行される。 sudo は必要無い。
- このプログラムでプロセスを止めない
- -> バックグランドで実行
rc-localを有効にする
rc-localを有効にする為に "sudo systemctl start rc-local" を行ったところ
とエラーメッセージが出ました(OS:Bookworm)。 "rc-local" をどのタイミングで実行するか聞いています。 そこで "rc-local.service" を修正します。/lib/systemd/system/rc-local.service の 末尾に以下を追加
2. .bashrc
ターミナルを開くたびに実行される。設定は "~/.bashrc" に追加。
これらはターミナルを開き、コマンドがタイプされた時に実行されるタイプ。 起動時には実行しません。下記の様に設定し
- if [ "$(tty)" = "/dev/tty1" ]:モニターの有無に関わらずtty1 というメインの仮想端末を立ち上げる。
- then 〜 :条件が合えば〜を実行
- 自動ログイン設定
- sudo raspi-config
- 1 System Options を選択
- S6 Auto Login を選択
- YesとOKを選択
3. cron (crontab)
指定した時間に、指定したコマンドを自動で実行する。 指定は5つの「時間指定」と「実行コマンド」の組み合わせです。 ”分 時 日 月 曜日 実行したいコマンド”
よく使う時間指定の例
| 設定 | 意味 |
|---|---|
| 0 9 * * * | 毎日、朝の 9:00 に実行 |
| */10 * * * * | 10分おきに実行 |
| 0 0 * * 0 | 毎週日曜日(0)の深夜 0:00 に実行 |
| @reboot | OSが起動した直後に1回だけ実行 |
設定は、crontab で行います。
- crontab -e: 設定を編集します(初回はエディターを選択)。
- crontab -l: 現在の設定内容を一覧表示します。
- crontab -r: 全ての設定を削除します。
4. systemd
現在の Linux における「最も正しく、強力な」自動起動の方法。 実行したいプログラムの情報を 「ユニットファイル」に書き込み、それをシステムに登録します。
設定ファイルの作成
- 設定ファイルの作成:/etc/systemd/system/ に、拡張子 ”service” のファイルを作る。
- 設定ファイルの中身
[Unit] Description=My Python Test Project After=network.target [Service] # 実行するユーザーを指定(省略するとデフォルトで root になります) User=root Group=root # 作業ディレクトリ WorkingDirectory=/home/ユーザー名/monitor # 実行コマンド(フルパスで記述) ExecStart=/home/ユーザー名/monitor/venv/bin/python3 monitor.py # 落ちたら自動で再起動する設定 Restart=always [Install] WantedBy=multi-user.target
- [Unit](ユニット): サービスの定義。
- Description: サービスの名前や説明。systemctl status で表示される。
- After: 起動の「順番」
- [Service](サービス):実行内容を定義
- ExecStart: 実行するコマンド。必ずフルパスで書く。デフォルトでバックグランドになる。
- WorkingDirectory: プログラムが動く「作業場所」
- Restart: systemd最大のメリット。Restart=always: プログラムが落ちても、「再起動」。
- [Install](インストール):このサービスを起動するタイミングを定義します。
- WantedBy=multi-user.target: After=network.targetの規定があるのでネットがつながって、マルチユーザーモードが上がったら起動となる
設定ファイル有効化
- 設定の読み込み: sudo systemctl daemon-reload
- 自動起動の有効化: sudo systemctl enable monitor.service
- サービスの開始: sudo systemctl start moniotor.service
- [Unit](ユニット): サービスの定義。
最後に
自動起動サービスとしてどれを使用するか。
- systemd:信頼性、機能を考慮してこれが本命
- cron (@reboot):設定が簡単。次点。
- .bashrc (tty1):自動起動はちょっと特殊。
- rc.local:昔からの方法。最近のOSでは敬遠がち