CLI 版 Kiosk 端末風の1機能専用の端末をラズパイ Zero で作りたい。
つまり、GUI なし(X11 なし)のラズパイ Zero の電源を入れたら、自動で CLI アプリが立ち上がり、入力待ちにさせたいのです。
CLI で動く Markdown のワープロ専用機でもいいですし、センサーの記録を確認するだけの端末だったり。
具体的には、親戚の年末の棚卸し用に、バーコードを読み取るだけの端末を作りたいのです。ラズパイに USB バーコード・リーダーとモバイル・バッテリーをつなげて、ヘッドレス(モニタのない状態)で読み取って、必要ならモニタを HDMI でつなげて確認する。そんなシンプルなものです。
だって、専用端末を買うとすごい高いんだもの。Raspberry Pi Zero WH + USB バーコードリーダーなら 5,000円を切るし。
そのためアプリはバックグラウンドでなくフォアグラウンドで自動起動させて入力待ちにさせたいのです。また、CLI アプリなので、動作の軽量化のため OS は X11 なしの CUI 版 Raspbian(Buster Lite)を使いたいのです。
TL; DR (今北産業)
Raspberry Pi Zero W の CUI 上で CLI アプリを自動起動する方法。
-
sudo raspi-config
のboot options
でConsole Autologin
を自動ログイン設定にする。 -
自動ログイン・ユーザーの
~/.bashrc
の文頭に以下を追加する。my_scriptは実行すると入力待ちになるスクリプトですif [ $(tty) == '/dev/tty1' ]; then /path/to/my_script; sudo halt; fi
-
【注意】 GUI つまりデスクトップ版でこれを設定すると起動直後に終了してしまい、詰むので注意。デスクトップ版(GUI 環境)でアプリを自動起動したい場合は、以下の記事をご覧ください。
🐒 僕とラズパイとバーコードリーダー
USB バーコードリーダーは接続すると普通の USB キーボードとして認識されます。つまり、ラズパイから見ればバーコードリーダーからのデータは、キーボード(もしくはテンキー)からの入力と同じ扱いになります。GUI であれば、入力フォームにフォーカスが当たっていれば、バーコードでピッと読み込めば入力できます。CUI の場合も STDIN からの入力待ちであれば、同じくピッと読み込めば入力できます。
TS; DR (GUI GUI くる、うざいヤツに対抗する。クイッ)
とある CLI アプリを作ったので「ラズパイの電源を入れるだけで動く俺様アプリの専用機」として使えないかと悩みました。
CLI アプリなのでデスクトップ環境も入れない Raspbian の Buster Lite
を使っています。モニタとキーボードがあれば、シェル上で /path/to/my_script
と打てば起動するのですが、専用機なのでそれも面倒くさい。
CUI 状態(X Window System なし)で CLI アプリをフロントエンドで待機させる方法が知りたかったのです。
「ラズパイ
ヘッドレス
CLI
アプリ
自動
起動
」とググっても、サービス起動などバックグラウンドでの実行ばかり。あっても、buster
では使えないタイプの autostart
を使った記事ばかりで使えるタイプが異なることに気づくのに時間がかかりました。
ラズパイのフォーラムを漁っていたところ、以下の情報が。
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 から確認します。次に下記のコマンドをコンソール上から実行します:
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 を使用できます。(Auto login + auto start application in Raspian Jessie Lite | forums @ RaspberryPi.org より)
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 | forums @ RaspberryPi.org