2017年11月29日水曜日

Raspberry Piでpythonアプリが自動起動しない

お久しぶりでございます。

Raspberry Pi + pythonでbluetoothを使ってちょっとしたツールを作りました。

で、systemctlで自動起動しようとしたのですが、動いてくれません。どうも起動してすぐエラーになっているようですが、ログにはexitしたと出るだけで具体的な内容がわかりません。

この記事を参考にして設定ファイルを書き、サービスを登録します。その場でstart / stopを実行するとちゃんと動いてくれます。


設定ファイルはこんな感じ

[Unit]
Description=sample
After=syslog.target
[Service]
Type=simple
ExecStart=/usr/bin/python2 /home/pi/locker/app/sample.py
TimeoutStopSec=5
StandardOutput=syslog
StandardError=syslog
[Install]
WantedBy=multi-user.target

ですが、動いてくれません。pythonがエラーは吐いているはずなんですが、ログに乗っかってくれません。

しばらく試行錯誤した後、/var/log/syslogを見てsample.serviceの起動に失敗した後で何が行われているか探してみたら、bluetoothが。このアプリはbluetooth使っているので、先にbluetoothが動いてなければそりゃ失敗しますがなorz

systemctl list-units --type=service

これで動いているサービスの一覧を出力すると、その中に

bluetooth.service loaded active running Bluetooth service 

があります。ログインした状態では当然bluetoothは起動していますが、自動起動では特に指定しないとサービス名順に実行が開始されますので、sample.serviceが起動した時点ではbluetooth.serviceは起動していないのは当然ですorz

ということで、設定ファイルを以下のように書き換えました。Afterにスペース区切りで上記のbluetoothのサービス名を追加します。

[Unit]
Description=sample
After=syslog.target bluetooth.service
[Service]
Type=simple
ExecStart=/usr/bin/python2 /home/pi/locker/app/sample.py
TimeoutStopSec=5
StandardOutput=syslog
StandardError=syslog
[Install]
WantedBy=multi-user.target

これで無事起動しました。最初wantsで指定したのですが、wantsは実行順には関係ないんですね。

systemctlはMacではずいぶん前から標準になっているんですが、Raspberry Piで使ってみたのは初めてです。コマンドラインでenable / disableで自動起動の有無を切り替えたり、start / stopでその場で起動 / 停止ができるので、なかなか便利です。

ともかく動いてよかったよかった。