ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【Raspberry Pi】プログラムの自動起動

 Raspberry PiはIoT機器としても使われることも多いかと思います。

 例えば、毎日朝に電源が入りデータを取得して夜には電源が落ちる、というような運用方法も割と考えられます。電源が投入される度に必要なプログラムを手動で起動するなんてことはやってられないので、Raspberry Piが起動するとプログラムも自動的に起動するようにするようにしたいところです。

 今回はそのプログラムの自動起動の手っ取り早くできる2つの方法についてです。基本的には参考資料に挙げているこちらのページ様の通りなので、詳しく知りたい方はそちらを参照してください。

 では、始めます。


1:rc.localを使う方法(root権限での実行)
 /etc/rc.localというファイルを編集することで、root権限でプログラムの自動起動ができます。

 まずはsudoコマンドでrc.localファイルを開きます。エディタはなんでもよいです。

$ sudo nano /etc/rc.local

 rc.localのファイルの中身は以下のようになっています。

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

exit 0

 ファイルの最後に「exit 0」という記述があるので、その前に実行したいプログラムを記述します。例えばpython3で動かしたいプログラムがあるなら以下のように記述します。

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

python3 /path/path/hogehoge.py #追加部分

exit 0

 記述できたら上書き保存し、Raspberry Piを再起動させます。

 再起動すると該当のプログラムがroot権限で実行されます。rc.localに記述したのに実行されない場合はこちらのページ様を参照してください。


2:crontabを使う方法(ユーザ権限での実行)
 1の方法ではroot権限でしたが、crontabを使うとユーザ権限での自動起動ができます。root権限で自動実行させたいという場合はあまりないと思うので、こちらを使うのがメインになるかと思います。

 以下のコマンドを実行して、crontabを編集します。

$ crontab -e

 初回起動時にエディタの種類を尋ねられると思いますが、好きな任意のエディタを選んでください。

 エディタが立ち上がるので、自動起動させたいプログラムを記述していきます。例えばpython3で動かしたいプログラムがあるなら以下のように記述します。

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

@reboot python3 /home/pi/path/hogehoge.py #追加部分

 追記したら上書き保存します。

 ちなみにcrontabに登録されている内容を確認するには以下のコマンドを実行します。

$ crontab -l

 これで再起動すると該当のプログラムがユーザ権限で実行されます。

 またcrontabは指定した日付と時間で実行することもできるので、こちらの方が自由度は高いと思います。


3:自動起動したプロセスの確認と終了
 1と2のどちらの方法でも自動起動は可能ですが、ちゃんと動いているかの確認や手動で止めたい場合もあります。

 その場合は実行しているプログラムのプロセスを確認して、そのプロセスを終了させる必要があります。

 実行しているプロセスは以下のコマンドで確認できます。

$ ps aux

 auxの部分はオプションで、aは自分以外のユーザのプロセスも表示、uはユーザ名と開始時刻の表示、xは制御端末のないプロセスの情報も表示です。ただこれだけだとプロセスの一覧が大量に表示されてしまうので、以下のようにgrepで必要なものだけ表示させます。

$ ps aux | grep hoge

 例えば1と2で実行しているのはpythonのプログラムなので「$ ps aux | grep python」としたり、実行ファイル名である「$ ps aux | grep hogehoge」などとすると見つけやすいかと思います。

 実際に実行すると以下のようになります。

$ ps aux | grep python
root       485  0.6  0.4  11436  7680 ?        S    16:33   0:00 python3 /home/pi/path/hogehoge.py
pi        1105  0.0  0.0   3916   580 pts/0    S+   16:33   0:00 grep --color=auto python

 最初に出てくるものがrc.localで実行しているプログラムです。rootユーザが「python3 /home/pi/path/hogehoge.py」を実行していることがわかります。

 これを停止させる場合は、このプロセスをkillする必要があります。

 プロセスをkillするコマンドは以下の通りです。

$ kill プロセス番号

 ユーザ名の後にある番号がプロセス番号です。つまりこの場合、killしたいプロセス番号は「485」になります。またこのプロセスはroot権限で実行されているため、killするときもsudoを付ける必要があります。

 つまりこのプロセスをkillするコマンドは以下になります。

$ sudo kill 485

 実行した後、再度確認するとちゃんとプロセスが消えています。

$ ps aux | grep python
pi        1145  0.0  0.0   3916   548 pts/0    S+   16:34   0:00 grep --color=auto python

 crontabに登録して実行した場合は以下のようになります。

$ ps aux | grep python
pi         473  0.0  0.0   1940   372 ?        Ss   16:45   0:00 /bin/sh -c python3 /home/pi/path/hogehoge.py
pi         475  0.8  0.4  11300  7464 ?        S    16:45   0:00 python3 /home/pi/path/hogehoge.py
pi        1136  0.0  0.0   3916   548 pts/0    S+   16:45   0:00 grep --color=auto python

 上2つがcrontabで実行されているプロセスです。2つあるので面倒ですが、これを一括でkillするには以下のコマンドを使います。

$ pkill -f hogehoge

 これで「hogehoge」という名前を含むプロセスをすべて一括でkillしてくれます。

 実行した後、再度確認するとちゃんとプロセスが消えています。

$ ps aux | grep python
pi        1173  0.0  0.0   3916   560 pts/0    S+   16:52   0:00 grep --color=auto python


 以上がRaspberry Piでプログラムを自動起動させる方法になります。

 割と使う機会があると思うので、IoT関連のことをやらせるときには必要になるかと思います。


・参考資料