/etc/udev/rules.d/ で接続時に USB にファイルを書き込む

/etc/udev/rules.d/ で接続時に USB にファイルを書き込む

Linux で USB を接続するときに、いくつかのファイルを書き込もうとしています。
実際、次のようなファイルがあります/etc/udev/rules.d/:

ACTION=="add",  ENV{ID_FS_UUID}=="9FE8-99G3", RUN+="/usr/bin/sudo -u myuser /home/myuser/Scripts/mycrazy.sh"

ではmycrazy.sh、次のものがあります:

## Path to mounted device
PATH_USB=/run/media/myuser/9FE8-99G3

mkdir $PATH_USB/some_folder

mkdir /home/myuser/Documents/another_folder

最初の mkdir は機能しません。しかし、2 番目は機能します。USB
にファイルを書き込むにはどうすればよいですか? スクリプトに何かが欠けていますか?

答え1

  • 私の場合は、遅延(sleep)と、disown中間スクリプトを使用して遅延のあるスクリプトを追加します。

    RUN{type}

    ...
           This can only be used for very short-running foreground tasks.
           Running an event process for a long period of time may block all
           further events for this or a dependent device.
    
           Starting daemons or other long running processes is not appropriate
           for udev; the forked processes, detached or not, will be
           unconditionally killed after the event handling has finished.
    

    ソース: man udev

  • ここにも同様のケースがあります:udevadm トリガーを使用すると udev ルールが実行されるのに、起動時には実行されないのはなぜですか?フェアマルトの回答ここでの私の解決策よりも良いようです。ファイルシステムが準備完了モードになるまで待機しますrw。試してみるとよいでしょう。

    これは USB ドライブなので、マウントする前に取り外すことができます。スクリプトは、次回の再起動または再度接続されて (別のインスタンスがトリガーされる) マウントされるまで有効のままになります。

    これを修正する 1 つの方法は、/dev/sdxY各サイクルで関連がまだ存在するかどうかを確認することです。

  • 私の設定は次のとおりです:

    1. /etc/udev/rules.d/99-sneetsher-tests.rules

      ACTION=="add", ENV{ID_FS_UUID}=="6664-B2DA", RUN+="/usr/bin/sudo -u user /home/user/mycrazy.sh"
      
    2. /home/user/mycrazy.sh

      #!/bin/sh
      
      /home/user/mycrazy2.sh & disown
      
    3. /home/user/mycrazy2.sh

      #!/bin/sh
      
      PATH_USB=/media/user/MYFLASH3
      sleep 5
      mkdir $PATH_USB/some_folder
      

関連情報