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でその場で起動 / 停止ができるので、なかなか便利です。
ともかく動いてよかったよかった。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。