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
各サイクルで関連がまだ存在するかどうかを確認することです。私の設定は次のとおりです:
/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"
/home/user/mycrazy.sh
#!/bin/sh /home/user/mycrazy2.sh & disown
/home/user/mycrazy2.sh
#!/bin/sh PATH_USB=/media/user/MYFLASH3 sleep 5 mkdir $PATH_USB/some_folder