CUI の、なんちゃって Kiosk 端末をラズパイ Zero で作りたい。

> CLI 版 [Kiosk 端末](https://ja.wikipedia.org/w/index.php?title=%E3%82%AD%E3%82%AA%E3%82%B9%E3%82%AF%E7%AB%AF%E6%9C%AB)風の**１機能専用の端末**をラズパイ Zero で作りたい。

つまり、GUI なし（X11 なし）のラズパイ Zero の電源を入れたら、自動で CLI アプリが立ち上がり、入力待ちにさせたいのです。

CLI で動く Markdown のワープロ専用機でもいいですし、センサーの記録を確認するだけの端末だったり。

具体的には、親戚の年末の棚卸し用に、バーコードを読み取るだけの端末を作りたいのです。ラズパイに USB バーコード・リーダーとモバイル・バッテリーをつなげて、ヘッドレス（モニタのない状態）で読み取って、必要ならモニタを HDMI でつなげて確認する。そんなシンプルなものです。

だって、専用端末を買うとすごい高いんだもの。Raspberry Pi Zero WH + USB バーコードリーダーなら 5,000円を切るし。

そのためアプリはバックグラウンドでなくフォアグラウンドで自動起動させて入力待ちにさせたいのです。また、CLI アプリなので、動作の軽量化のため OS は [X11](https://ja.wikipedia.org/wiki/X_Window_System) なしの CUI 版 Raspbian（Buster Lite）を使いたいのです。

# TL; DR <sub><sup><sub><sup>（今北産業）</sup></sub></sup></sub>

Raspberry Pi Zero W の CUI 上で CLI アプリを自動起動する方法。

1. `sudo raspi-config` の `boot options` で `Console Autologin` を自動ログイン設定にする。
2. 自動ログイン・ユーザーの `~/.bashrc` の文頭に以下を追加する。

    ```bash:my_scriptは実行すると入力待ちになるスクリプトです
    if [ $(tty) == '/dev/tty1' ]; then /path/to/my_script; sudo halt; fi
    ```
3. <font color=red>【注意】</font> GUI つまりデスクトップ版でこれを設定すると**起動直後に終了してしまい、詰む**ので注意。デスクトップ版（GUI 環境）でアプリを自動起動したい場合は、以下の記事をご覧ください。

    - [Raspberry Piでプログラムを自動起動する5種類の方法を比較・解説](https://qiita.com/karaage0703/items/ed18f318a1775b28eab4) @ Qiita

:::note info
<sup><sub>🐒 **僕とラズパイとバーコードリーダー**
USB バーコードリーダーは接続すると普通の USB キーボードとして認識されます。つまり、ラズパイから見れば**バーコードリーダーからのデータは、キーボード（もしくはテンキー）からの入力と同じ**扱いになります。GUI であれば、入力フォームにフォーカスが当たっていれば、バーコードでピッと読み込めば入力できます。CUI の場合も STDIN からの入力待ちであれば、同じくピッと読み込めば入力できます。
</sub></sup>
:::

# TS; DR <sub><sup><sub><sup>（GUI GUI くる、うざいヤツに対抗する。<ruby>クイ<rt>CUI</rt></ruby>ッ）</sup></sub></sup></sub>

とある CLI アプリを作ったので「ラズパイの電源を入れるだけで動く俺様アプリの専用機」として使えないかと悩みました。

CLI アプリなのでデスクトップ環境も入れない Raspbian の `Buster Lite` を使っています。モニタとキーボードがあれば、シェル上で `/path/to/my_script` と打てば起動するのですが、専用機なのでそれも面倒くさい。

CUI 状態（X Window System なし）で **CLI アプリをフロントエンドで待機させる方法**が知りたかったのです。

[「`ラズパイ` `ヘッドレス` `CLI` `アプリ` `自動` `起動`」とググって](https://www.google.com/search?q=%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4+%E3%83%98%E3%83%83%E3%83%89%E3%83%AC%E3%82%B9+CLI+%E3%82%A2%E3%83%97%E3%83%AA+%E8%87%AA%E5%8B%95+%E8%B5%B7%E5%8B%95)も、サービス起動などバックグラウンドでの実行ばかり。あっても、`buster` では使えないタイプの `autostart` を使った記事ばかりで[使えるタイプが異なる](https://qiita.com/karaage0703/items/ed18f318a1775b28eab4#raspbian-buster%E4%BB%A5%E9%99%8D%E3%81%A7%E3%81%AEautostart%E8%A8%AD%E5%AE%9A)ことに気づくのに時間がかかりました。

ラズパイのフォーラムを漁っていたところ、以下の情報が。

> I have a very simple solution that works with very little effort. The first thing to do is to install the OS and make it login automatically to the CLI, set your keyboard configuration, install wordgrinder. Then boot into the CLI and make sure that everything works as expected before making the next change.
> 
> Now enter the following command on the console:
>
>> 【筆者意訳】 
>> ごくわずかな努力で動作する、非常に簡単な方法があります。まず OS をインストールし、CLI の自動ログインとキーボード構成を（`raspi-config` で）設定します。自動起動させたいアプリ、例えば `wordgrinder` をインストールします。次の変更を行う前に、再起動してアプリがすべてが期待どおりに機能するか CLI から確認します。
>>
>> 次に下記のコマンドをコンソール上から実行します:
>
> ```bash
> sed -i "1 i if [ \`tty\` == '/dev/tty1' ]; then wordgrinder;sudo halt; fi"  .bashrc
> ```
> 
> From this point a reboot will automatically start wordgrinder and the system will be halted when you exit wordgrinder.
>
> For maintenance you can use ssh or the CLI by pressing Alt-F2 when wordgrinder is loaded.
>
>> 筆者訳）
>> この時点から、再起動すると `wordgrinder` が自動的に起動し、`wordgrinder` を終了するとシステムが停止します。
>>
>> メンテナンスをしたい場合は `ssh` 接続するか、`wordgrinder` が実行されているときに Alt-F2 を押すと CLI を使用できます。
>
> <sup>（[Auto login + auto start application in Raspian Jessie Lite](https://www.raspberrypi.org/forums/viewtopic.php?p=1112842#p1112842) | forums @ RaspberryPi.org より）</sup>

```bash:.bashrcの１行目
if [ $(tty) == '/dev/tty1' ]; then /path/to/my_script; sudo halt; fi
```

`.bashrc` に上記が記載されていると、ラズパイ起動時に `/path/to/my_script` が実行され `my_script` が起動します。モニタを繋げてみるとスクリプトが自動実行され、待機しているのがわかると思います。

また、`sudo halt` により `my_script` が終了すると OS もシャットダウンを始めます。`halt` が気になる場合は、`sudo shutdown now` でもいいかもしれません。

ちなみに `SSH` 接続した場合は、`tty`（ターミナルの入出力）が `/dev/tty1` ではなくなるためログインしても `my_script` は実行されません。

# 参考文献

- [Auto login + auto start application in Raspian Jessie Lite](https://www.raspberrypi.org/forums/viewtopic.php?p=1112842#p1112842) | forums @ RaspberryPi.org

## あわせて読みたい

- [Raspberry Piでプログラムを自動起動する5種類の方法を比較・解説](https://qiita.com/karaage0703/items/ed18f318a1775b28eab4) @ Qiita