Miho's Memory

組込みとアートとまぜまぜ

RasPi のプログラムを自動起動に!その2 systemd 編

RasPi Python 自動起動 第二弾!

今回は systemd を使います.

準備するもの:

・自動実行させたい Python プログラム(※1)
Pythonプログラムを実行する 単一プログラム  .shファイル(※2)
・/etc/systemd/system/xxx.service ファイル(※3)

※1
今回は print文 のみ記述したものを用意した.
でも,いっこ注意が必要! init や systemd から起動されたプログラムの場合,print の出力はコンソールではなく,ログファイルに記録されるようになっているので画面に出ないのだ.画面にだしたい場合は,Python のプログラムの方でコンソールを open したり,ごにょごにょ.

※2
systemd の ExecStart には引数などの指定はできなくないんだけど,トラブルの原因になるから,できるだけ単一プログラムが良い ^^*

※3
xxx のところは好きに変えて良いよ ^^

さあ,じゃあつくろう!

ちょっとまったぁー!
Python プログラムも単一プログラムもどこに作ろうとしてる?!

ここ /opt の下がいいよ!

なぜなら,Filesystem Hierarchy Standard(http://www.pathname.com/fhs/)で決まっているので,起動時にマウントされていることが保証されているからなんですって💛
ということで,システム固有のプログラムというかディストリビュータ以外のサードベンダープログラムは /opt の下に置くのがまぁ正しいのです ^^

ということで

pi@raspberrypi:~ $ sudo mkdir /opt/mybin

/opt の下に オリジナルな mybin ディレクトリを作りました.
そしてこの中に,自動実行させたい Pythonプログラムと,それを実行するための単一プログラムを作りましょう!

pi@raspberrypi:/opt/mybin $ cat Hello_RasPiGirl.py
print "Hi! RaspberryPi Girls. I'm Miho."

pi@raspberrypi:/opt/mybin $ cat autoRasPiGirl.sh
#!/bin/sh
/usr/bin/env python /opt/mybin/Hello_RasPiGirl.py

 

それぞれのファイルの実行属性を見てみましょう

pi@raspberrypi:/opt/mybin $ ls -al
-rw-r--r-- 1 root root 44 10月 29 23:49 Hello_RasPiGirl.py
-rw-r--r-- 1 root root 61 10月 29 23:52 autoRasPiGirl.sh

 

.sh ファイルには 実行属性を付けておきましょう

pi@raspberrypi:/opt/mybin $ sudo chmod 755 autoRasPiGirl.sh
pi@raspberrypi:/opt/mybin $ ls -al
-rw-r--r-- 1 root root 44 10月 29 23:49 Hello_RasPiGirl.py
-rwxr-xr-x 1 root root 61 10月 29 23:52 autoRasPiGirl.sh

 

ちな,.sh を実行すると,Hello_RasPiGirl.py が実行されます.
pi@raspberrypi:/opt/mybin $ sh autoRasPiGirl.sh
Hi! RaspberryPi Girls. I'm Miho.

 

準備は整ったので,いよいよ systemd を使って自動起動をやってみる!

pi@raspberrypi:/etc/systemd/system $ cat autoexecRasPiGirl.service
[Unit]
Description = AutoBootProgram_Test     ← お好きにどうぞ ^^#

[Service]
ExecStart=/opt/mybin/autoRasPiGirl.sh  ← 実行したいプログラムのフルパス
Restart=no
Type=simple

[Install]
WantedBy=multi-user.target

 

再読み込みをしておこう!
pi@raspberrypi:/etc/systemd/system $ sudo systemctl daemon-reload
特に何の音沙汰もない

続けて,起動時にサービスが自動で起動するように設定しましょう
pi@raspberrypi:/etc/systemd/system $ sudo systemctl enable autoexecRasPiGirl
Created symlink from /etc/systemd/system/multi-user.target.wants/autoexecRasPiGirl.service to /etc/systemd/system/autoexecRasPiGirl.service.

systemd を使ってサービスを起動させる
pi@raspberrypi:/etc/systemd/system $ sudo LANG=C systemctl start autoexecRasPiGirl.service
特に何の音沙汰もない

出力はログにでるので以下を実行して確認してみよう!pi@raspberrypi:/etc/systemd/system $ sudo LANG=C systemctl status -l autoexecRasPiGirl.service
* autoexecRasPiGirl.service - AutoBootProgram_Test
Loaded: loaded (/etc/systemd/system/autoexecRasPiGirl.service; enabled)
Active: inactive (dead) since Mon 2017-10-30 00:16:41 JST; 2min 12s ago
Process: 8662 ExecStart=/opt/mybin/autoRasPiGirl.sh (code=exited, status=0/SUCCESS)
Main PID: 8662 (code=exited, status=0/SUCCESS)

Oct 30 00:16:41 raspberrypi systemd[1]: Started AutoBootProgram_Test.
Oct 30 00:16:41 raspberrypi autoRasPiGirl.sh[8662]: Hi! RaspberryPi Girls. I'm Miho.

みえてるよ!!実行されてるよ!!
最後の行だよ!!^^#

では,RasPi を 再起動させてみましょう♪

f:id:MihoN:20171030002756p:plain
.bashrc のようにコンソールにはでてきません.
けど,ログファイルを見て!

f:id:MihoN:20171030003152p:plain
ちゃんと実行されてることが分かります ^^#

つぎは,コンソールに出力されるようにするにはどうするか,
そして,今回print文が書かれた .py の自動起動だったけど,無限ループの .py ならどうしたらいいのかを書いていきます ^^#

最後に,
自動起動をやめたい場合は

pi@raspberrypi:~ $ sudo systemctl disable autoexecRasPiGirl.service

で OK です.

これで自動実行 2個 制覇 ^^v

今回参考にさせていただいたのはお友達のこのサイトです!

qiita.com

もう少しこのサイトを参考にして試したいことがあるんだいっ ^^#