追加読書

追加読書

GPIOに接続されたスイッチとセンサー、およびTTYシリアルを介して接続されたArduinoから入力を受け取るRaspberry-Piベースのデバイスがあります。これらすべてを管理する主なアプリケーションはPython3で書かれています。これは起動シェルスクリプトですlauncher.sh

cd /home/pi/ProjectName
venv/bin/python main.py &

そして、このシェルスクリプトは起動時に自動実行のためにcrontabに登録されます。

$ sudo crontab -e

crontabファイルに追加:

@reboot sudo su pi /home/pi/ProjectName/launcher.sh >> /home/pi/crontab.log 2>&1

これにより、stdoutまたはstderrのすべての出力がログファイルにキャプチャされます。

まれに奇妙な状況では、Pythonコードが失敗し、ログファイルにキャプチャされていないエラーが記録されますcrontab.log。ただし、ログファイルに追加された各行のタイムスタンプがないと、問題を分析するのは困難です。文字だけあり、時間情報はありません。また、デバイスを再起動するたびにログファイルがリセットされます。

もちろん、現在の日付/時刻からいくつかの動的ログファイル名を生成できるため、これは主な問題ではありません。ただし、ログファイルへのすべての貢献がタイムスタンプで補完されるようにロギングを設定する方法がわかりません。

ベストアンサー1

1990年代に世界はこれを達成するためのツールを発明しました。シェルスクリプトでそれらを再作成する必要はありません。厳密なサイズ制限、自動回転、オンデマンド回転、タイムスタンプの命名、ログファイル、および各出力行の先頭のタイムスタンプを提供します。

multilog行タイムスタンプは、、およびのデフォルト以外のオプションであり、s6-logコマンドsvlogdラインtinylogオプション/引数によって有効になります。 cyclog無条件のタイムスタンプを追加してください。

これらのツールによって追加されたTAI64Nタイムスタンプは次のとおりです(例:https://unix.stackexchange.com/a/294276/5132)は時間帯やDST変更の影響を受けず、機械が扱いやすく、tai64nlocalフィルタを介して人間が読める形式に簡単に変換できます。

Kusalanandaのcronテーブルエントリを調整します。

@reboot sudo -u pi sh -c '~pi/ProjectName/launcher.sh 2>&1 cyclog ~pi/log/crontab' |

または:

@reboot sudo -u pi sh -c '~pi/ProjectName/launcher.sh 2>&1 |複数のログ ~pi/log/crontab'

より悪い方法があります一部フィルタを使用すると、次のようになりますtai64n

@reboot sudo -u pi sh -c '~pi/ProjectName/launcher.sh 2>&1 tai64n >> ~pi/crontab.log'

ただし、ログファイルのサイズ制限、自動循環、またはタイムスタンプの命名は適用されません。次のステップは、避けられない再作成(より悪いことはシェルスクリプトで)を短縮し、固有の不安定性の問題をlogrotate解決し、logrotate上記のように1990年代にジャンプすることです。

1990年代にジャンプするもう一つの方法は、次のように始めることです。サービスマネージャcronこれは、システムオペレータが使用するのではなく、実行時にサービスを停止/開始できるようにする複数のインスタンス、デーモンコンテキスト、および適切な管理メカニズムを防止することに関連しています@reboot

一部のサービスマネージャにはサービス定義メカニズムがあります。完全に避けるlauncher.shラッパースクリプトやその他の項目が必要ですsudo。以下は、noshサービスパッケージ(別のサービス定義を表示)に変換されたシステム単位(1つのサービス定義を表示)です。

%猫プロジェクト名。サービス
[単位]
説明=https://unix.stackexchange.com/a/559920/5132
[提供する]
ユーザー=pi
作業ディレクトリ=/home/pi/%p
ExecStart=venv/bin/python main.py
[インストールする]
WantedBy =マルチユーザー。ターゲット
%
%システム制御変換 systemd-units ./ProjectName.service
%
%システム制御印刷サービススクリプト。/ProjectName
開始: #!/bin/nosh
start:#./ProjectName.service で生成されたスタートアップファイル
開始:事実
停止: #!/bin/nosh
stop:#./ProjectName.service で生成されたファイルを停止する
停止:事実
実行: #!/bin/nosh
run:#./ProjectName.service で生成されたファイルを実行します。
実行:#https://unix.stackexchange.com/a/559920/5132
実行:envuidgid --supplement --pi
実行:userenv-fromenv
実行:chdir /home/pi/プロジェクト名
実行: setuidgid --supplement --pi
実行:venv/bin/python main.py
再起動: #!/bin/sh
restart:#./ProjectName.service で生成されたファイルを再起動します。
再起動:スリープ0.1
restart:exec false#スクリプトパラメータを無視します。
%

cyclog@ProjectNamenoshサービス管理および一般的なdaemontoolsシリーズサービス管理の場合は、ロギング(実行など)用の並列(または同様の)サービスパッケージもcyclog設定multilogし、後者が前者のロギングサービスであることをサービス管理者に通知します。

nosh per-user-manager、systemd、Upstartなどのサービス管理者は、ユーザーに権限のないサービスを構成、実行、および管理するためのメカニズムも提供します。

追加読書

おすすめ記事