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
~からデーモンツール、またはブルースガンターのmultilog
~からdaemontools-アンコールまたはAdammultilog
Sampson艦隊 - ローランベルコ
s6-log
~からs6 - ゲレットペプの
svlogd
~から走る - ウェインマーシャル
tinylog
~から犯人 - 私のもの
cyclog
~からおやつ
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@ProjectName
noshサービス管理および一般的なdaemontoolsシリーズサービス管理の場合は、ロギング(実行など)用の並列(または同様の)サービスパッケージもcyclog
設定multilog
し、後者が前者のロギングサービスであることをサービス管理者に通知します。
nosh per-user-manager
、systemd、Upstartなどのサービス管理者は、ユーザーに権限のないサービスを構成、実行、および管理するためのメカニズムも提供します。
追加読書
- ジョナサンデボインポラード(2015)。 」記録」。デーモンツールシリーズ。一般的な答え。
- ジョナサンデボインポラード(2016)。今世紀にはlogrotateやnewsyslogを使用しないでください。。一般的な答え。
- ジョナサンデボインポラード(2016)。 」ログ後処理」。 スナックガイド。ソフトウェア。
- https://unix.stackexchange.com/a/392924/5132
- https://unix.stackexchange.com/a/326166/5132
- https://unix.stackexchange.com/a/326166/5132