Raspberry Piで自動起動する方法
Raspberry Piにはプログラムを自動起動する方法がたくさんあります。それぞれ特徴があるので、自分が簡単と思う順にまとめていきます。自分もブートの仕組みちゃんと全部理解できていないので徐々にまとめていこうと思います。
大きくは以下5つがあるという認識です。
- /etc/rc.local
- autostart
- crontab
@reboot
- /etc/init.d
- systemd
/etc/rc.local
/etc/rc.local
に自動起動したいコマンドやスクリプトを書くと、起動時に実行されます。好きなエディタで編集しましょう(以下はvimの例です)。
$ sudo vim /etc/rc.local
ファイルの最後にexit 0
とあるので、その手前に起動時に実行したいコマンドをを書きます。hogehoge
というコマンドだったら
hogehoge
exit 0
と書きます。自作のスクリプト(例えば hogehoge.sh
とします)を使いたい場合は /usr/local/bin/hogehoge.sh
に置いて、/etc/rc.local
に以下のように書くのがよいかと思います。
hogehoge.sh
exit 0
なお、/etc/rc.local
に書かれたコマンドは、root権限で実行されます。
crontab @reboot
cronを使って起動時にプログラムを走らせることもできます。ユーザー権限でプログラムが実行されるので、root権限で走ったら困るようなプログラムに使えます。例えばROS(Robot Operating System)のノードを立ち上げるときは、crontabを使うのも良いと思います。
以下コマンドでcrontabを修正します。
$ crontab -e
以下のように追記します
@reboot /home/pi/hogehoge.sh
これで起動時にhogehoge.sh
が実行されます。
autostart を使用する方法
いわゆるWindowsのスタートアップにあたるものです。GUIのプログラムを起動時に実行したいときに使います。Raspbian Buster以降とそれ以前で設定方法が異なるので注意して下さい。
Raspbian Buster以降でのautostart設定
以下コマンドを実行して、autostartファイルの雛形を、ホームディレクトリのコンフィグにコピーします。
$ mkdir -p ~/.config/lxsession/LXDE-pi
$ cp /etc/xdg/lxsession/LXDE-pi/autostart ~/.config/lxsession/LXDE-pi/
あとは、~/.config/lxsession/LXDE-pi/autostart
ファイルに実行したいコマンド名を追記するだけです。
今回はxeyesというマウスを目玉で追うというアプリでテストしてみましょう。まずは以下コマンドでxeyesをインストールしておきます。
$ sudo apt update
$ sudo apt install x11-apps
これで /usr/bin/xeyes
とターミナルで実行すると目玉が表示されます。このアプリを自動起動するためには、以下コマンドを実行して、autostartファイルに/usr/bin/xeyes
を追記します。
$ echo '/usr/bin/xeyes' >> ~/.config/lxsession/LXDE-pi/autostart
この後、再起動すれば、以下のように自動的にxeyesが起動します。
Raspbian Buster以前でのautostart設定
以下コマンドでautostartというファイルを作成します。
$ vim ~/.config/lxsession/LXDE-pi/autostart
/home/pi/hogehoge.sh
を起動したい場合は、以下のように記載します。
@/home/pi/hogehoge.sh
autostartで自動起動に失敗するケース
autostartだと、何故か自動起動できないプログラムもあります。その場合は、他の方法を使うと起動できるケースもあります。
例えば、Sonic Piの場合は、私はautostartで起動できなかったので、以下の記事を参考にcrontabで自動起動をさせました。
Sonic Pi for standalone installations
/etc/init.d を使う方法
Raspbian Wheezyまではこちらを使うことが推奨されていました。Raspbian Jessieからはsystemdが推奨されているので、ここでは詳細の説明は省略します。
systemd を使う方法
Raspbian Jessieから推奨されている自動起動の方法です。サービスとして、起動したり、シャットダウンしたり、再起動したりもできるようになるので、真面目にプログラムをサービスとして管理したいならsystemdを使うのがよいです。
以下webiopi
を自動起動したいときの例を記載します。まず以下のようなwebiopi.service
というファイルを作成します。
[Unit]
Description=WebIOPI
After=syslog.target
[Service]
Type=simple
WorkingDirectory=/usr/share/webiopi/htdocs
ExecStart=/usr/bin/python3 -m webiopi -l /var/log/webiopi -c /etc/webiopi/config
TimeoutStopSec=5
StandardOutput=null
[Install]
WantedBy = multi-user.target
基本的には、Description
にサービス名、WorkingDirectory
に作業ディレクリ名、ExecStart
に実行したいプログラムを記載すればよいです。他のオプションに関しては、systemdの仕様を調べて必要に応じて修正しましょう。
作成したwebiopi.service
は、/etc/systemd/system
以下に移動して読み込む必要があります。具体的には次のコマンドで移動と読み込みを行います。
$ sudo mv webiopi.service /etc/systemd/system/
$ sudo systemctl daemon-reload
続いて、以下のコマンドを実行すると、systemdを使ってサービスを起動することができます。
$ sudo systemctl start webiopi
サービスを停止したいときは以下コマンドを実行しましょう。
$ sudo systemctl stop webiopi
サービスの起動、停止が確認できたら、自動起動を設定しましょう。以下コマンドを実行します。
$ sudo systemctl enable webiopi
これで起動時にサービスが自動で起動するようになります。自動起動をやめたい場合は以下です。
$ sudo systemctl disable webiopi
まとめ
Raspberry Piで自動起動させる方法に関してまとめました。色々方法があるので用途によって使い分けましょう。それぞれ特徴がありますが、自分の中での選択の基準は以下です。
- 手軽にとにかく自動で起動させたいなら
/etc/rc.local
- ユーザー権限で実行させたいプログラムは
crontab @reboot
- GUIのプログラムは
autostart
- しっかり管理したいなら
systemd
- 特別な事情があれば
/etc/init.d
自動起動に関する記事
ラズパイの CUI で起動時に CLI アプリをフォアグラウンドで自動起動させて入力待ちにさせる
関連記事
変更履歴
- 2022/02/15 微修正
- 2020/01/26 Raspbian Buster以降でのautostartでの自動起動に関して追記
コメント
@KEINOS(編集済み)
-
ログインユーザーの
~/.bashrc|head -1
2
@PAO10700
@KEINOS(編集済み)
crontabの変更内容
起動時に空白のCalcドキュメントを開くコマンド
- LibreOffice ソフトウェアをパラメータを指定して起動する | 3.3 @ help.libreoffice.org より
プロセスからofficeを含むものをkill
以下でも可能な場合がある
- How to kill libreoffice from command line @ NEWBEDEV より
crontab
2
@PAO10701
@KEINOS0
@PAO10700
@PAO10701
@PAO10701
@KEINOS(編集済み) - ターミナルから
-
インストール先の確認とパスの例
1
@PAO10703
@KEINOS
1
@PAO10702
CLI アプリ向けの F.Y.I.
GUI GUI 来られると重いので、もっと Lite に付き合いたいと、Buster Lite などの CUI 版 Raspbian で CLI アプリ専用端末を作りたい。
つまり CLI 版 Kiosk 端末みたいなものを作りたい場合の、本記事の
/etc/rc.local
の応用技 TIPS です。~/.bashrc
の行頭に下記を記載するこの場合、マシンを起動すると
/path/to/my_script
の CLI アプリが実行された状態で CUI の画面が待機します。そしてアプリを終了すると、OS がhalt
でシャットダウンします。halt
の代わりにshutdown now
でもいいと思います。また、メンテナンスも、SSH で接続すれば(
tty
が変わるため)アプリは起動しない状態でログインできるのでメンテも楽です。例えば、自動ログインユーザー設定にしておいて、電源を入れるだけで
vim
もしくはEmacs
が起動する「なんちゃってワープロ」専用機や、MPS-Youtube 専用の CLI 版ジュークボックスとか、マニアックな物を作りたい場合に。@karaage0703様、
とても参考になる投稿、誠にありがとうございました。
LibreOffice calcを決まった時刻に開き、きまった時刻に閉じる方法をご教示頂くことはできませんでしょうか?
@PAO1070 さま
横から失礼します。恐らく当記事の crontab の手法を応用して可能かと思います。
つまり、LibreOffice の
calc
の起動と終了をコマンドで実行する方法をみつけ、crontab
に追記する方法です。LibreOffice Calc を定時起動と終了する 3 つのポイント
営業日の定時に実行
cron
は「コマンドのタイマー実行サービス」みたいなものなので、cron
の使い方から掘り下げていくといいと思います。crontab -e
は「指定した時間に、指定したコマンドを実行させるためのリスト」を編集(edit
)するコマンドです。常駐しているcron
サービス(crond
)は、そのリストを参照して、時間が来たら適宜コマンドを実行するだけの仕組みです。当記事の「@reboot」は、指定時間を「ブート時」(
on reboot
に実行)という意味になります。例えば、これを「毎週月曜〜金曜の朝 7:30 に実行」としたい場合は以下のように変更します。30 7 * * 1-5
は実行時間の条件で、crontab.guru というサイトで調べると楽です。次に、実行されるコマンドの箇所
/home/pi/hogehoge.sh
を LibreOffice の起動もしくは終了のコマンドに書き換えます。Calc を起動するコマンド
LibreOffice のサイトに以下の情報がありました。LibreOffice の本体(
soffice
)に-calc
を付けると Calc を起動できるようです。soffice
のインストール先パスはwhich soffice
で探せます。起動中の LibreOffice を強制終了するコマンド
最後に、起動している LibreOffice を終了するコマンドですが、プロセスを強制終了させる方法が王道と思われます。(強制終了させるので保存はされません)
以下の記事を見つけました。
ps aux
コマンドで起動中のプロセスから、grep
コマンドでoffice
を含むプロセスだけをふるいにかけ、awk
コマンドでプロセス ID を抜き出し、kill -9
コマンドでそのプロセス ID を終了させています。ただ、複数の LibreOffice 系のアプリが立ち上がっていると上記では動かないので、以下で全ての
soffice.bin
のプロセスをkill
(強制終了)できる可能性もあるようです。まとめ
LibreOffice ユーザでないため、以上は机上論なのですが、参考になれば幸いです。
@KEINOS様、
詳しいご説明のお返事誠にありがとうございます。
本来は自分で調べないといけないところ、最初から最後までご丁寧に本当にありがとうございます。
30日から休暇に入りますため、さっそくトライしてみようと思います。
結果はまたご報告したいと思います。
重ねてお礼申し上げます。
@PAO1070
何かをしたくても、とっかかりがないと何から手を付けていいのか分かりませんよね〜。
かくいう私も「マシンを起動したら Windows のスタートアップみたいに○○を起動できないかなー」と思い、この記事に辿り着きました。そして
autostart
とcrontab @reboot
の存在を知ったのでした。無事に動いたら Qiita 記事にしてみると良いと思います。同じような悩みを持った人が絶対いると思うので。
こんばんは。
今までずっとチャレンジしてきたのですが、実は、crontabが実行できないという、一番最初の壁を超えることができず、いまだに、どこかに良い解決策がないか、ネットをさまよっている日々が続いております。
min117様の記事も試してみましたが、ダメでした。。。
https://min117.hatenablog.com/entry/2017/06/30/012936
https://min117.hatenablog.com/entry/2017/06/25/103621
”Scheduled tasks”を試せないかセッティングを試みたのですが、
”GNOME scheduler for automatic tasks”をインストールできず、これも断念しています。
もう少し頑張ってみようと思っています。
@KEINOS 様、
やっと、crontab命令を使って、Desktop上に、test.txtファイルを1分毎に生成させることができるようになりました。
*/1 * * * * touch /home/pi/Desktop/test.txt
@KEINOS様のご指導内容と同じ事なのですが、なぜかできるようになるまで、一ヶ月半ほどかかりました。。。。
下記をターミナルに直接打ってEnterキーを押してみました。
/path/to/install/program/soffice -calc
「bash: /path/to/install/program/soffice: そのようなファイルやディレクトリはありません」が
表示されたのですが、どうしたら、libreoffice calcを立ち上げることができるのか、
今一度ご教示頂くことできませんでしょうか?
RaspberryPIのフォルダ階層は、root/home/pi/Desktopのような階層構造と思うのですが、
sofficeがrootからどこにあるのかも、よくわからない状況でございます。
誠に申し訳ございません、お力添え頂けますと大変ありがたく存じます。
Desktop上に、"test.ods"というlibreoffice calcのファイルを置きました。
ターミナル上から、"soffice --calc /home/pi/Desktop/test.ods"を実行してみたところ、
起動することができました。
次に、crontabに、1分毎に起動させる為、"*/1 * * * * soffice --calc /home/pi/Desktop/test.ods"
を仕込んでみたのですが、1分経過しても何も起きません。
続けてターミナル上から、"soffice --calc /home/pi/Desktop/test.ods"を実行しても何も起きなくなっています。
教えて頂きました"killall soffice.bin"をターミナルから打った後で、
ターミナル上から、"soffice --calc /home/pi/Desktop/test.ods"を実行すると、無事に立ち上がりました。
どうやら、crontabの"*/1 * * * * soffice --calc /home/pi/Desktop/test.ods"は実行されて
いるものの画面上にlibreofficeは表示されていないようなのです。
今、ここで行き詰まっております。。。引き続き調査してみたいと思います。
@KEINOS様のアドバイス無くして、絶対にここまで来ることもできなかったと思います。
深く感謝しております。
書いてることがわからないも、色々触ってみたら、実は書いてあることと同じだった、ってこと多いですよね。わかります。仕組みの理解以前に用語やコマンドの耳馴染みがないし。
でも、切り分けとして正しい方向に向かっていると思います。
soffice --calc ...
と打って起動する。crontab
では実行されている気配はあるものの画面に表示されない。以上から、現状考えられるのは「実行者」か「パスの指定」だと思います。
ps aux
で全てのユーザの現在のプロセス一覧が見れます。cron
で叩かれる(自動実行される)のを待ってから、プロセス一覧にsoffice
がいれば、「起動はしている」と言えると思います。恐らく、その場合は実行ユーザーが自分以外になっていないでしょうか。プロセスに
soffice
がいない場合は実行されるも起動に失敗していると思われます。その場合は恐らくパスの指定が足りないのだと思います。crontab
に記載されたコマンドは、実行時にPATH
などの環境変数が読み込まれません。つまり、soffice
とだけ打たれても、どこのパスを探しに行けばいいのかわからないのです。そのためプログラムやコマンドは基本的にフルパスで記載する必要があります。
また、先の例にあった
/path/to/install/program/soffice
でエラーが出るというのは、パスがダミーだからです。これは、環境によってインストール先が変わるため「これは実際に置き換えてね」という意図で使われるパスの記法の習慣です。そのため、これを実際のパスに置き換える必要があります。
通常インストールの場合は
/usr/bin/soffice
などになっていると思いますが、実際のパスはwhich soffice
コマンドで確認できます。表示されたパスを以下のように置き換えて指定してみてください。
@KEINOS様、
お世話になっております。
本当に毎回、暖かいメッセージありがとうございます。
$which soffice 知りませんでした、勉強不足でございます。
試してみた所、たしかに、/usr/bin/soffice でした。
本当に参考になりました。
1点1点理論的なご説明、本当にありがとうございます。
私のようなWebをさまよって、コピペでなんとかコードを作ってきた(うまくできるかどうかは、運頼み。。)
私には本当にありがたい事でございます。
本当に、本当にありがとうございます。 m(_ _)m
実は下記コマンドを教えて頂いたので、試してみました所、表示させることができました。
*/1 * * * * export DISPLAY=:0 && soffice --calc /home/pi/Desktop/test.ods
解決しましたか!よかった。
そうでした、GUI アプリでしたね。
export DISPLAY=:0
で、環境変数DISPLAY
に:0
で描画の出力先のディスプレイを指定してあげないと、アプリがどのウィンドウに描画していいのか伝わらないですものね。cron
は基本ディスプレイいらない裏方処理なので。納得です。みんな通る道ですよね!
写経しても何を書いてるかわからないし、コピペピピックするもカオスでワケワカメな感じ。むしろ、乱取り稽古する中で、カンナを削るような薄さで体で理解していく感覚が近かったかもしれません。
かもしれませんってか、私も現在進行形なんですけど!お互い頑張りましょう!
この記事や、コメント欄がまた誰かの参考になることを願って。
@KEINOS様、
暖かいメッセージありがとうございます。
@KEINOS様も迷いながら今の実力をつけたのですね。
とても勇気づけられます!
私もいつか、困った方のお力になれるよう精進してまいります!