私はラズベリーパイ4モデルBを使用しています。 USBデバイスを接続すると、自動的に実行されるスクリプトを作成しようとします。 USBデバイスのテキストファイルから読み取りを試みます。
これが私がこれまでに達成したことです。 USBはudev
私のスクリプトを実行するイベントをトリガーします。このスクリプトにはroot権限があります。実行すると、インストールされているls /media/username
すべてのデバイスの後に実行されます。
ここではいくつかの問題が発生します。スクリプト(イベントによって実行されたときudev
)が私のUSBデバイスを見つけることができません。しかし、スクリプトを手動で実行すると機能します。したがって、スクリプトは失敗せず(絶対パスを使用して環境変数を使用しない)、端末にコマンドなどを入力すると、すべてのコマンドが機能します。権限の問題のようですが、間違っている可能性があります。
答え1
udev
(セキュリティホールを防ぐために追加された)プライベートマウントネームスペースを無効にする代わりに、代替ソリューションを提案します。
まず、デバイスに一致するudevルールを作成してTAG+="systemd"
追加します。これにより、udev
デバイスを単位で呼び出すようにsystemd
求められます*.device
。
デフォルトでは、デバイス名はデバイスのsysfsパスと一致し、スラッシュはダッシュに置き換えられます。つまり、 にある場合、対応するデバイスデバイスttyS0
は と表示されます。この名前が気に入らない場合は、追加して決定できる2番目の名前を作成してください。/sys
/sys/devices/pnp0/00:01/tty/ttyS0
sys-devices-pnp0-00:01-tty-ttyS0.device
ENV{SYSTEMD_ALIAS}+="<desired device unit name>"
エイリアスはまだスラッシュ - ダッシュプロセスを経ているので、似たようなものが必要な場合sys-subsystem-media-devices-somename.device
(他のサブシステムがすでに実行しているものと似ています)ENV{SYSTEMD_ALIAS}+="/sys/subsystem/media/devices/somename"
。
デバイスが*.device
適切な名前のデバイスとして表示されたら、カスタムsystemd
スクリプトを指定されたサービスに渡して、デバイスが表示さWantedBy="sys-subsystem-media-devices-somename.device"
れたときにシステムデバイスを起動できます。スクリプトにrootアクセスが必要なく、ログインしたユーザーがいる場合にのみ実行する必要がある場合は、次のように設定することもできます。ユーザーサービス/etc/systemd/user/*.service
つまり、すべてのユーザーに対して定義されるか、~/.config/systemd/user/*.service
特定のユーザーに対してのみ定義されます。
あるいは、udevルールで次のいずれかを指定して、udevルールにサービスの依存関係を提供することもできます。
ENV{SYSTEMD_WANTS}="<system service to start on hotplug>.service"
ENV{SYSTEMD_USER_WANTS}="<user service to start on hotplug>.service"
これは、ソフトウェアがどのようにモジュール化されているか、ユーザーにどれだけ選択的であるかに応じて、udevルールとサービスの間で責任を分配するさまざまな方法を提供します。
- システムサービスへの依存関係として指定すると、ユーザーがログインしているかどうかにかかわらずサービスがトリガーされます。無効にするには、そのサービスをブロックまたは削除する必要があります(root権限を使用)。
- これがユーザー・サービスに対する udev 指定の依存関係として指定されている場合、ユーザーは、すべてのユーザーの基本ユーザー・サービスとともに、root 権限を必要とせずにサービスを実行できるかどうかを選択できます。個々のユーザーのための-outメカニズム。
- udevルールでデバイス単位を生成するためにudevオプションのみを指定すると、デバイスが表示されたときにサービスが自動的に開始されるように選択できます。これは、サービス部分を独立して更新したい場合に便利です。