cron
RaspberryPi
systemd
ラズパイ
316
どのような問題がありますか?

投稿日

更新日

Raspberry Piでプログラムを自動起動する5種類の方法を比較・解説

Raspberry Piで自動起動する方法

 Raspberry Piにはプログラムを自動起動する方法がたくさんあります。それぞれ特徴があるので、自分が簡単と思う順にまとめていきます。自分もブートの仕組みちゃんと全部理解できていないので徐々にまとめていこうと思います。

 大きくは以下5つがあるという認識です。

  1. /etc/rc.local
  2. autostart
  3. crontab @reboot
  4. /etc/init.d
  5. 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が起動します。

xeyes_autostart.png

参考:起動時にアプリを自動実行したいのですが

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での自動起動に関して追記
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
karaage0703
最近はZennに移行気味です。 https://zenn.dev/karaage0703 闇のエンジニア/変なデジカメ開発中/ディープラーニング芸人/Raspberry Piとからあげ大好き/はてなブログ書いてます

コメント

(編集済み)
CLI アプリ向けの F.Y.I.

GUI GUI 来られると重いので、もっと Lite に付き合いたいと、Buster Lite などの CUI 版 Raspbian で CLI アプリ専用端末を作りたい。

つまり CLI 版 Kiosk 端末みたいなものを作りたい場合の、本記事の /etc/rc.local の応用技 TIPS です。

  • ログインユーザーの ~/.bashrc の行頭に下記を記載する
~/.bashrc|head -1
if [ $(tty) == '/dev/tty1' ]; then /path/to/my_script; sudo halt; fi

この場合、マシンを起動すると /path/to/my_script の CLI アプリが実行された状態で CUI の画面が待機します。そしてアプリを終了すると、OS が halt でシャットダウンします。halt の代わりに shutdown now でもいいと思います。

また、メンテナンスも、SSH で接続すれば(tty が変わるため)アプリは起動しない状態でログインできるのでメンテも楽です。

例えば、自動ログインユーザー設定にしておいて、電源を入れるだけで vim もしくは Emacs が起動する「なんちゃってワープロ」専用機や、MPS-Youtube 専用の CLI 版ジュークボックスとか、マニアックな物を作りたい場合に。

2

@karaage0703様、

とても参考になる投稿、誠にありがとうございました。

LibreOffice calcを決まった時刻に開き、きまった時刻に閉じる方法をご教示頂くことはできませんでしょうか?

0
(編集済み)

@PAO1070 さま

LibreOffice calcを決まった時刻に開き、きまった時刻に閉じる方法

横から失礼します。恐らく当記事の crontab の手法を応用して可能かと思います。

つまり、LibreOffice の calc の起動と終了をコマンドで実行する方法をみつけ、crontab に追記する方法です。

LibreOffice Calc を定時起動と終了する 3 つのポイント

営業日の定時に実行

cron は「コマンドのタイマー実行サービス」みたいなものなので、cron の使い方から掘り下げていくといいと思います。

crontab -e は「指定した時間に、指定したコマンドを実行させるためのリスト」を編集(edit)するコマンドです。常駐している cron サービス(crond)は、そのリストを参照して、時間が来たら適宜コマンドを実行するだけの仕組みです。

当記事の「@​reboot​」は、指定時間を「ブート時」(on reboot に実行)という意味になります。例えば、これを「毎週月曜〜金曜の朝 7:30 に実行」としたい場合は以下のように変更します。

crontabの変更内容
- @reboot                /home/pi/hogehoge.sh
+ 30 7 * * 1-5           /home/pi/hogehoge.sh

30 7 * * 1-5 は実行時間の条件で、crontab.guru というサイトで調べると楽です。

次に、実行されるコマンドの箇所 /home/pi/hogehoge.sh を LibreOffice の起動もしくは終了のコマンドに書き換えます。

Calc を起動するコマンド

LibreOffice のサイトに以下の情報がありました。LibreOffice の本体(soffice)に -calc を付けると Calc を起動できるようです。

起動時に空白のCalcドキュメントを開くコマンド
/path/to/install/program/soffice -calc

起動中の LibreOffice を強制終了するコマンド

最後に、起動している LibreOffice を終了するコマンドですが、プロセスを強制終了させる方法が王道と思われます。(強制終了させるので保存はされません)

以下の記事を見つけました。ps aux コマンドで起動中のプロセスから、grep コマンドで office を含むプロセスだけをふるいにかけ、awk コマンドでプロセス ID を抜き出し、kill -9 コマンドでそのプロセス ID を終了させています。

プロセスからofficeを含むものをkill
ps aux | grep -i office | awk {'print $2'} | xargs kill -9

ただ、複数の LibreOffice 系のアプリが立ち上がっていると上記では動かないので、以下で全ての soffice.bin のプロセスを kill(強制終了)できる可能性もあるようです。

以下でも可能な場合がある
killall soffice.bin

まとめ

crontab
# Boot LibreOffice Calc at 07:30 on every day-of-week from Mon-Fri.
30 7 * * 1-5           /path/to/install/program/soffice -calc

# Force shutdown LibreOffice At 18:30 on every day-of-week from Mon-Fri.
30 18 * * 1-5          killall soffice.bin

LibreOffice ユーザでないため、以上は机上論なのですが、参考になれば幸いです。

2

@KEINOS様、
詳しいご説明のお返事誠にありがとうございます。
本来は自分で調べないといけないところ、最初から最後までご丁寧に本当にありがとうございます。
30日から休暇に入りますため、さっそくトライしてみようと思います。
結果はまたご報告したいと思います。
重ねてお礼申し上げます。

1

@PAO1070

何かをしたくても、とっかかりがないと何から手を付けていいのか分かりませんよね〜。

かくいう私も「マシンを起動したら Windows のスタートアップみたいに○○を起動できないかなー」と思い、この記事に辿り着きました。そして autostartcrontab @reboot の存在を知ったのでした。:smile:

無事に動いたら Qiita 記事にしてみると良いと思います。同じような悩みを持った人が絶対いると思うので。

0

こんばんは。
今までずっとチャレンジしてきたのですが、実は、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”をインストールできず、これも断念しています。

もう少し頑張ってみようと思っています。

0

@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からどこにあるのかも、よくわからない状況でございます。

誠に申し訳ございません、お力添え頂けますと大変ありがたく存じます。

1

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様のアドバイス無くして、絶対にここまで来ることもできなかったと思います。
深く感謝しております。

1
(編集済み)

書いてることがわからないも、色々触ってみたら、実は書いてあることと同じだった、ってこと多いですよね。わかります。仕組みの理解以前に用語やコマンドの耳馴染みがないし。:grin:

でも、切り分けとして正しい方向に向かっていると思います。

  1. ターミナルから soffice --calc ... と打って起動する。
  2. crontab では実行されている気配はあるものの画面に表示されない。

以上から、現状考えられるのは「実行者」か「パスの指定」だと思います。

ps aux で全てのユーザの現在のプロセス一覧が見れます。

cron で叩かれる(自動実行される)のを待ってから、プロセス一覧に soffice がいれば、「起動はしている」と言えると思います。恐らく、その場合は実行ユーザーが自分以外になっていないでしょうか。

プロセスに soffice がいない場合は実行されるも起動に失敗していると思われます。その場合は恐らくパスの指定が足りないのだと思います。

crontab に記載されたコマンドは、実行時に PATH などの環境変数が読み込まれません。つまり、soffice とだけ打たれても、どこのパスを探しに行けばいいのかわからないのです。

そのためプログラムやコマンドは基本的にフルパスで記載する必要があります。

また、先の例にあった /path/to/install/program/soffice でエラーが出るというのは、パスがダミーだからです。

これは、環境によってインストール先が変わるため「これは実際に置き換えてね」という意図で使われるパスの記法の習慣です。そのため、これを実際のパスに置き換える必要があります。

通常インストールの場合は /usr/bin/soffice などになっていると思いますが、実際のパスは which soffice コマンドで確認できます。

インストール先の確認とパスの例
$ which soffice
/usr/bin/soffice

表示されたパスを以下のように置き換えて指定してみてください。

- */1 * * * * soffice --calc /home/pi/Desktop/test.ods
+ */1 * * * * /usr/bin/soffice --calc /home/pi/Desktop/test.ods
1

@KEINOS様、
お世話になっております。
本当に毎回、暖かいメッセージありがとうございます。
$which soffice 知りませんでした、勉強不足でございます。
試してみた所、たしかに、/usr/bin/soffice でした。
本当に参考になりました。

1点1点理論的なご説明、本当にありがとうございます。
私のようなWebをさまよって、コピペでなんとかコードを作ってきた(うまくできるかどうかは、運頼み。。)
私には本当にありがたい事でございます。
本当に、本当にありがとうございます。 m(_ _)m

実は下記コマンドを教えて頂いたので、試してみました所、表示させることができました。

*/1 * * * * export DISPLAY=:0 && soffice --calc /home/pi/Desktop/test.ods

3

実は下記コマンドを教えて頂いたので、試してみました所、表示させることができました。

*/1 * * * * export DISPLAY=:0 && soffice --calc /home/pi/Desktop/test.ods

解決しましたか!よかった。

そうでした、GUI アプリでしたね。export DISPLAY=:0 で、環境変数 DISPLAY:0 で描画の出力先のディスプレイを指定してあげないと、アプリがどのウィンドウに描画していいのか伝わらないですものね。cron は基本ディスプレイいらない裏方処理なので。納得です。

私のようなWebをさまよって、コピペでなんとかコードを作ってきた(うまくできるかどうかは、運頼み。。)

みんな通る道ですよね!:grin:

写経しても何を書いてるかわからないし、コピペピピックするもカオスでワケワカメな感じ。むしろ、乱取り稽古する中で、カンナを削るような薄さで体で理解していく感覚が近かったかもしれません。

かもしれませんってか、私も現在進行形なんですけど!お互い頑張りましょう!

この記事や、コメント欄がまた誰かの参考になることを願って。

1

@KEINOS様、
暖かいメッセージありがとうございます。
@KEINOS様も迷いながら今の実力をつけたのですね。
とても勇気づけられます!
私もいつか、困った方のお力になれるよう精進してまいります!

2
どのような問題がありますか?
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
データに関する記事を書こう!
~
新人プログラマ応援 - みんなで新人を育てよう!
~
316
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー