RaspberryPi_電源SWと電源LEDをSystemdをつかってサービス化

img_2035

RaspberryPiには通常PCの様な電源スイッチは無いです。

電源ON=PWR USBケーブルを挿入
電源OFF=コマンドからshutdown -h now(poweroff) 後 PWR USBケーブル抜き
再起動=コマンドからshutdown -r now(reboot)
NICのLEDを見て電源状態を判断しhなければなりません。
そこで、
PCライクな電源スイッチを実装するのは難しそうなのでタクトスイッチの押下時間でシャットダウン・リブートの選択。それに応じてのLED点滅 運転時のLED点灯を実装をしてみました。当初はrc.localに記述をしていたが、いまの時代野暮かと。

Pythonを使ってのコマンド

vi /usr/local/sbin/power-btn.py

#!/usr/bin/env python2.7
import RPi.GPIO as GPIO
import os
import time

BCMLED=4
BCMPWSW=17

GPIO.setmode(GPIO.BCM)
GPIO.setup(BCMPWSW, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(BCMLED, GPIO.OUT)
GPIO.output(BCMLED, GPIO.HIGH)

cnt = 0
while cnt < 200:
    if GPIO.input(BCMPWSW) == GPIO.LOW:
        cnt += 1
    else:
        if cnt > 0:
            print "power button will reboot the system..."
            GPIO.output(BCMLED, GPIO.LOW)
            time.sleep(0.5)
            GPIO.output(BCMLED, GPIO.HIGH)
            time.sleep(2.0)
            GPIO.output(BCMLED, GPIO.LOW)
            GPIO.cleanup()
            os.system("/sbin/reboot")
            break
        cnt = 0
    time.sleep(0.01) # by 10 ms
else:
    print "power button will shutdown the system..."
    GPIO.output(BCMLED, GPIO.LOW)
    time.sleep(0.5)
    GPIO.output(BCMLED,GPIO.HIGH)
    time.sleep(0.5)
    GPIO.output(BCMLED, GPIO.LOW)
    GPIO.cleanup()
    os.system("/sbin/shutdown -h now")

 

 

実行権限を付与
chmod +x /usr/local/sbin/power-btn.py

systemdで使うコマンド

pythonでつくったコマンドをそのまま差しただけのコマンド(もっとスマートになるはず)

vi /usr/local/sbin/power-btn.sh

#!/bin/bash
python /usr/local/sbin/power-btn.py

実行権限を付与
chmod +x /usr/local/sbin/power-btn.sh

systemdの定義ファイル作成

vi /etc/systemd/system/power-btn.service

[Unit]
Description = power-btn daemon

[Service]
ExecStart = /usr/local/sbin/power-btn.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

実行権限を付与
chmod 0755 /etc/systemd/system/power-btn.service

自動起動設定後起動

systemctl enable power-btn.service
systemctl start power-btn.service
systemctl status power-btn.service
● power-btn.service - power-btn daemon
 Loaded: loaded (/etc/systemd/system/power-btn.service; enabled)
 Active: active (running) since 土 2016-12-31 15:59:17 JST; 42min ago
 Main PID: 489 (power-btn.sh)
 CGroup: /system.slice/power-btn.service
 ├489 /bin/bash /usr/local/sbin/power-btn.sh
 └512 python /usr/local/sbin/power-btn.py

12月 31 15:59:17 raspberrypi systemd[1]: Started power-btn daemon.

問題点(自分の運用には問題なし)

systemdのrestart stopに対応していない。そのまま運転を続けてしまいます。。。。まぁrc.localからの単純移行なのでよしとします。

コメント