起動時に起動し、特定のログ名前空間といくつかのdmesgをローカルにファイルに書き込む単純なワンシュートシステムサービスファイルをRaspberry Piに作成しました。
テストでローカルでスクリプトを実行すると動作するように見えますが、自動起動に問題があり、まったく動作しません。
テストサービス
[Unit]
Description=Test message
After=multi-user.target
[Service]
Type=oneshot
ExecStart=/data/test.sh
StandardOutput=journal
[Install]
WantedBy=multi-user.target
システムはシンプルでコンテンツが多くありません。 rootユーザーのみが存在します。
さらに、システムはログに記録され、LogNamespace = temp_loggerを持つ温度ロガーを開始します。私はそれを依存関係や他のものに入れませんでした。
これで、次のものを含むtest.shファイルを実行します。
#!/bin/bash
echo $(date)
TEST_DIR=/data/testdirectory
mkdir -p $(TEST_DIR)
journalctl -f --namespace=temp_logger > ${TEST_DIR}/journaltemp.log &
dmesg -w > ${TEST_DIR}/dmesg.log &
とてもうまくいくようです。エラーもなく、何もありません。よさそうだねサービスを有効にしてsystemctl enable test
システムを再起動すると、いくつかの問題が発生するようです。
ディレクトリは生成されず、ログファイルは存在しません。 (テストから削除しました)
確認すると、systemctl status test
echo、mkdirなどのコマンドが見つからないというエラーメッセージが表示されます。
echo
or などのすべての呼び出しを etcmkdir
に変更すると動作するようです。エコ、日付、ディレクトリを取得します。コマンドを使用してバイナリへのすべての呼び出しを確認し、パスを調整しました。/bin/echo
/bin/mkdir
which
しかし、ロギングが機能していないようです。ファイルがありますが、内容はありません(サイズ0)。
何の問題がありましたか?バイナリへの絶対パスを提供する必要があるのはなぜですか?なぜJournalctlが機能しないのですか?
答え1
サービスには単純な依存関係があり、ロギングサービス自体が開始する前に開始されることがわかりました。
おそらくファイルがそこにある理由でしょう。ただし、サイズは常に0です。lsof
dmesg.log または Journaltemp.log ファイルを表示するプロセスはありません。
私は sleep 5
test.shファイルの先頭に良いol 'を置き、それから動作しました。
後で開始するサービスファイルにログを設定すると、より良いよりきれいな解決策があるかもしれませんが、理解することはできません。よく眠り、今私のtest.shの一部です。