[Raspberry Pi]起動時に何かを自動実行させる方法比較
起動時にとあるプロセスを自動で起動させる必要が出てきたので、方法を調べたんだけど、わりかし色んな方法がある事が分かった。
ただ、どれもが同じように振る舞うわけではなく、それぞれ微妙に差異があったので、それについて記録しておく。
ちなみに、起動時に走らせたいファイルは以下の3つ。
A.py | 同ディレクトリにある複数のpythonスクリプトを呼び出して使うようなpythonスクリプト |
B.py | ボタンの割り込みを感知して、"sudo shutdown -h now"を呼び出すpythonスクリプト |
C.py | ボタンの割り込みを感知して、"sudo reboot"を呼び出すpythonスクリプト |
rc.local
やり方
以下のコマンドで編集画面に入る。
1 | $ sudo nano /etc/rc.local |
そしたら、ファイルの最後に「exit 0」という文言が出てくると思うので、それの前に実行したいコマンドを書く。
1 2 3 4 5 6 7 8 9 10 11 | ~(前略)~ if [ "$_IP" ]; then printf "My IP address is %s\n" "$_IP" fi python A.py python B.py python C.py exit 0 |
結果
A.pyがなぜか止まってしまった。
もしかしたらパスの関係とかで、実行スクリプトが他のスクリプトにアクセスできないのかもしれない。
crontab
やり方
以下のコマンドで編集画面を出す。
1 | $ crontab -e |
そんで、末尾に実行したいコマンドを書く。
1 2 3 4 5 6 7 8 9 10 11 | ~(前略)~ # 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 python A.py @reboot python B.py @reboot python C.py |
結果
一応全部動いた。
初めはB.pyの"sudo shutdown -h now"とか"sudo reboot"が効かなかったんだけど、なんやかんややってたら動くようになってた。
意味が分からん
あとcrontabを使うと、rc.localが実行されない?
いやそんな事はないはずなんだけど、crontabを使うとrc.localに書いておいたものが起動しない。
ん~、これはもう少し要検証って感じ。
systemd
やり方
serviceファイルを作成する。
A.pyの場合で説明するが、同じようにB.py、C.pyについてもserviceファイルを作る。
1 | $ sudo nano /etc/systemd/system/A.service |
中身は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 | [Unit] Description=A.py script # Name of service After=syslog.target # Execute this service after syslog.target starting [Service] ExecStart=/home/pi/.pyenv/shims/python /home/pi/A.py Restart=always # When the process stops, it restarts StandardOutput=syslog # Output to syslog StandardError=syslog # Output to syslog [Install] WantedBy=multi-user.target |
そして、自動で起動できるよう設定する。
1 | $ sudo systemctl enable A.service |
結果
これも"sudo reboot"とかが効かない。
はえ~なんでだろ
追記:
これは試してないけど、もしかしたらUserとかGroupをrootにしたらうまく動くかもしれない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [Unit] Description=A.py script # Name of service After=syslog.target # Execute this service after syslog.target starting [Service] ExecStart=/home/pi/.pyenv/shims/python /home/pi/A.py Restart=always # When the process stops, it restarts StandardOutput=syslog # Output to syslog StandardError=syslog # Output to syslog User=root Group=root [Install] WantedBy=multi-user.target |
この記事へのコメントはこちら