私が達成したいのはとても簡単です。
BluetoothデバイスをRspberry Pi 3(Raspbian実行)に接続するたびに、スクリプトはログファイルにエントリを追加します。
単に難しいことがすでにうまくいっているからです。
携帯電話をペアリングしたときに携帯電話が接続または切断されるたびに、次のルールがトリガーされます。
pi@ras-pi:/ $ cat /etc/udev/rules.d/99-input.rules
SUBSYSTEM=="input",GROUP="input",MODE="0660"
KERNEL=="input[0-9]*",RUN+="/bin/bash -c 'echo TEST > /tmp/logfile.log'"
ただし、結果は常に存在しないログファイルと1の戻りコードです。
pi@ras-pi:/ $ journalctl -xe -u systemd-udevd
Sep 05 12:54:09 ras-pi systemd-udevd[2333]: Process '/bin/bash -c 'echo TEST > /tmp/logfile.log'' failed with exit code 1.
この時点で、これは非常に簡単な例であることに注意してください。
最初は正常に呼び出され、エコーと出力リダイレクトを使用してログファイルにいくつかの情報を書き込むように設計されたスタンドアロンスクリプトがありました。
同じ結果をテストするために、スクリプト内のさまざまなターゲットディレクトリと場所を試しました(終了コード1で失敗しました)。
現在のbashセッションでスクリプトを実行すると、上記のコマンドと同じように機能します。
pi@ras-pi:/ $ /bin/bash -c 'echo TEST > /tmp/logfile.log'
出力リダイレクトを削除すると、ファイルに書き込もうとせず、ログにエラーメッセージが表示されないため、スクリプトが正しく機能して問題を引き起こすのはリダイレクトにすぎないようです。元の例でも同様です。
KERNEL=="input[0-9]*",RUN+="/bin/bash -c 'echo TEST'"
もちろん、私の最初の推測は「権限」だったので、これはtmpディレクトリです。
pi@ras-pi:/ $ ls -la /
(...)
drwxrwxrwt 10 root root 4096 Sep 5 12:54 tmp
(...)
私が実行しているスクリプトは次のとおりです(完全性のため)。
pi@ras-pi:/ $ ls -la /usr/bin/bt_connect
-rwxr-xr-x 1 root root 110 Sep 5 11:36 /usr/bin/bt_connect
ああ、ところで:追加することはsudo
役に立ちません:
pi@ras-pi:/ $ cat /etc/udev/rules.d/99-input.rules
SUBSYSTEM=="input",GROUP="input",MODE="0660"
KERNEL=="input[0-9]*",RUN+="/bin/bash -c 'sudo echo TEST > /tmp/logfile.log'"
これは、次のような結果をもたらします。
Sep 05 13:13:23 ras-pi systemd-udevd[2398]: Process '/bin/bash -c 'sudo echo TEST > /tmp/logfile.log'' failed with exit code 1.
誰でもこの問題を解決するのに役立ちますか?
更新:少なくとも私はついにファイルに書き込むのではなく、/ dev / kmsgに書き込んでいくつかのデバッグ出力を生成する方法を見つけました。これは私のスクリプトの一例です。
echo $MSGCAT Path=$PATH >> /dev/kmsg
このようにスクリプトが「root」ユーザーとして実行されていることがわかりましたが、これまではファイルへの出力が機能しない理由が見つかりませんでした。
答え1
Raspibianでは、systemd-udevdサービスはシステムパラメータProtectSystemを使用して実行される可能性があります。これは、udevが/ devディレクトリのファイルにのみ書き込むことができることを意味します。走れば
sudo systemctl edit systemd-udevd
udevサービスのパラメータを変更できるシステムテキストエディタ(ほとんどのnano)で、空(以前に変更していない場合)のテキストファイルが開きます。 ~によるとhttps://www.freedesktop.org/software/systemd/man/systemd.exec.htmlあなたは追加したいかもしれません
ReadWritePaths=/tmp
動作するように元のスクリプト(/tmp/logfile.logに記録)をインポートします。変更を適用するには、udevdを再起動する必要があります。
sudo systemctl restart systemd-udevd