起動、終了時にログを出力する 【Raspberry Pi】

Python

Raspberry Pi で起動、自動終了時のログを残す方法設定の手順についてまとめておきます。
具体的には、起動時、終了時にログを残す Python のスクリプトを作っておき、これらを Raspberry Pi (Linux) の cron 機能を使って登録することで、起動、終了時に自動でログを残すようにします。

以下の環境で動作確認をしています。
環境: Raspberry Pi 3 model B+、USBカードリーダー、ログ保存用の SDカード

背景

Raspberry Pi で、日ごろ、自動起動、自動終了をさせて定型作業の自動化を進めています。
自動化するにあたり、Raspberry Pi の起動時や、シャットダウン時にログを残しておくと、何か問題があったときにトレースができ、とても便利です。
また、自作の Python のスクリプトについても、同様に自動で実行するように設定し、ログも保存するようにしておくと、後から、過去のすべての来歴を確認できます。
起動、終了や、実行した処理内容の記録を残しておくと、自動化したい各機能や実行時刻などを把握できるようになります。数か月運用してみて、ログから、各機能の重要度、要否を見直したり、最適化をすることが可能となります。
そこでまずは、起動時、終了時のスクリプトと設定手順をまとめておくことにします。

設定方法

起動・終了用のスクリプトの作成

① Raspberry Pi に自動処理用のフォルダを作ってください。
例: /home/pi/auto1/
② ①のフォルダに、”01_start1.py”、”02_shutdown1.py” 等の名前でテキストファイルを作り、下記のサンプルスクリプトをコピー&ペーストして保存してください。
③ ログファイルは、①のフォルダ内に書き出すようにしています。
フォルダの場所やフォルダ名を変える場合は、必要により、②のスクリプト内に記載したパスを修正してください。

スクリプトを自動で実行するよう設定する

④ ターミナルを起動し、”crontab -e” と入力し、[enter] キーを押します。
⑤ 起動した cron の編集画面で、以下の行を追加します。

@reboot sleep 30
@reboot sudo python /home/pi/auto1/01_start1.py
30 23  * * * sudo python /home/pi/auto1/02_shutdown1.py

★ ①でフォルダ名を変えた場合は、上記の Python スクリプトのあるパスを修正してください。
★ 上の例は、起動時に、30 秒スリープした後、Python のスクリプト 01_start1.py を実行する例です。
★ 加えて、23:30 になったら、02_shutdown1.py を実行します。
必要により、自動でシャットダウンをする時刻(23:30)などを修正してください。
★ それぞれのスクリプトには、起動とシャットダウンする日時のログを保存するようにしています。
起動、終了する際に、同フォルダ内に時刻付きのログを保存します。

⑥ 編集が終わったら、[ctrl] + [y] キーを押します。
編集内容を保存する場合は [y] キーを押します。編集内容を破棄する場合は、[n] キーを押します。

→ 設定は完了です。

ログが保存されることを確認する

⑦ Raspberry Pi を再起動してみて、起動時のログが保存されることを確認してください。
また、⑤で設定した時刻に 02_shutdown1.py が実行され、Raspberry Pi がシャットダウンされることを確認してください。

→ これで動作確認も完了です。
必要により、フォルダの場所や自動終了の時刻などを修正、最適化してください。

また、ターミナルから手入力で、02_shutdown1.py を Python で実行すると、ログを残したのち、シャットダウンを実行します。

サンプルコードの説明

・ 両方のスクリプトで def write_append1() としたところで、ログを書き出す関数を定義しています。
重複する記載を1つにまとめて呼び出すようにしてもよいですが、わかりやすさのため、2つのスクリプトで同じ関数を定義しています。
・ str1 としたところで、ログに書き出す文字列を作っています。具体的には、日付 + 時刻 + “start” または “shutdown” の文字列を作っています。
・ path1 としたところで、書き出すログのパスを定義しています。書き出す場所を変える場合は、この部分を修正してください。
・ write_append1() 関数を実行し、ログを書き出します。
・ シャットダウンをするスクリプトでは、この後、シャットダウンのコマンド文字列を作って、実行しています。
・ ログは、アペンドモードで記録しています。すなわち、すでに書かれたログは残し、末尾の行にログを追加する動作となります。

うまく動いたら

★ うまく動いたら、スクリプトや実行タイミングを修正するなど改善をしてみてください。
★ また、上記のサンプルでは、簡単のため/説明のため、Raspberry Pi の起動 SD カード内にログを残すようにしています。
長期間運用する場合は、ログファイルを USB カードリーダーの SD カードに書き出すようにしたほうが安全です。改善を検討してみてください。

まとめ

起動時のサンプルコードと、シャットダウン時のサンプルコードについてまとめました。
また、これらのスクリプトを Raspberry Pi (Linux) の cron 機能を使って登録し、自動実行する手順をまとめました。

Raspberry Pi のハードウェアの電源の ON/OFF については、下記の関連リンクにまとめています。これらを組み合わせることで、ハードウェアとソフトウェアのいずれでも自動化が可能となります。起動/終了/計測/自動処理などのログのトレースも可能です。

関連リンク
・ Raspberry Pi を自動で起動、シャットダウンする

サンプルコード1:起動時のスクリプトの例


import datetime as dt1 

def write_append1( file1, str1 ): 
    with open( file1, "a" ) as f1: 
        f1.write( str1 + "\n" ) 
    return 0 

str1 = dt1.datetime.now().strftime( "%y%m%d %H%M%S" ) + " start " 
print( str1 ) 

path1 = "/home/pi/auto1/" 
file1 = path1 + "log1.txt" 
write_append1( file1, str1 ) 

サンプルコード2:シャットダウン時のスクリプトの例


import datetime as dt1 
import subprocess as sp1
import shlex as sl1 

def write_append1( file1, str1 ): 
    with open( file1, "a" ) as f1: 
        f1.write( str1 + "\n" ) 
    return 0 

str1 = dt1.datetime.now().strftime( "%y%m%d %H%M%S" ) + " shutdown " 
print( str1 ) 

path1 = "/home/pi/auto1/" 
file1 = path1 + "log1.txt" 
write_append1( file1, str1 ) 

cmd1 = "sudo shutdown -h now" 
print( cmd1 ) 
arg1 = sl1.split( cmd1 ) 
ret1 = sp1.call( arg1 ) 
タイトルとURLをコピーしました