シェルスクリプトを実行するudevルールはスクリプト全体で機能しますが、完了しません。

シェルスクリプトを実行するudevルールはスクリプト全体で機能しますが、完了しません。

シェルスクリプトを実行してディレクトリを作成し、デバイスを読み取り専用モードでマウントするudevルールがあります。問題は、ルールが実行されたとき(デバイスを接続するとき)にディレクトリが作成されますが、デバイスがマウントされないことです。

当然、スクリプトに何か問題があるでしょう。ただし、スクリプトを実行できます(デバイスをリンクし、udevルールによって生成されたディレクトリを手動で削除してから手動でスクリプトを実行することもできます)、ディレクトリが作成され、デバイスが正しくマウントされます。

udevルールの関連部分(ファイル名= '10-magicusb.rules'):

ENV{MYMOUNT}=="1", RUN+="/etc/udev/scripts/romount.sh"

ローマウント.sh:

#!/bin/bash
mkdir /media/sdb1
/bin/mount /dev/sdb1 -o ro,noatime /media/sdb1

技術的には、デバイス名はudevルールよりも高いレベルに由来します(ハードコードされていません。私を信じてください)。生成されたスクリプトを実行し、romount.shそのスクリプトをデバイスに渡します%k。ただし、これはスクリプトの後に関連してはいけません。走るudevで実行されますが、実行の途中で停止します。

私の推測では、ここにタイミングの問題があるようです。ルールが実行されると、何らかの理由でデバイスをマウントできなくなりますが、後で手動でマウントすると、システムが問題を解決する時間があるようです。sleep 10bashスクリプトの上部に役に立たないように1つを追加しました。

よろしくお願いします。

編集1

David G.が投稿した内容に基づいて、改善されたスクリプトを使用していくつかのテストを行いましたromount.sh

#!/bin/bash
mkdir /media/sdb1
(
    echo 'before while iteration' > /etc/udev/scripts/iteration.txt
    while [[ ! -b /dev/sdb1 ]]
    do
        sleep 1
        echo 'iteration performed' > /etc/udev/scripts/iteration.txt
    done
    /bin/mount /dev/sdb1 -o ro,noatime /media/sdb1
) &

生成されたiteration.txtファイルはbefore while iteration次のとおりです。これは、whileループの条件がトリガーされないことを意味します。これは、実行時にデバイスノードを使用できることを意味します。そうですか?

編集2

ついに2回目の回答で作業するようになりました。ディスクマウントの Udev ルールが機能しません。

systemd-udevd.serviceにPrivateMounts = Noを追加すると私に役立ちました。

ベストアンサー1

問題は、デバイスノードが作成される前にスクリプトが実行されることです。次のように試してみてください(つまり、ハードコーディングなし)。

#!/bin/bash
mkdir /media/sdb1
(
    while [[ ! -b /dev/sdb1 ]]
    do
        sleep 1
    done
    /bin/mount /dev/sdb1 -o ro,noatime /media/sdb1
) &

重要な部分は背景サブシェルです。

udevが実行する操作によっては、stdin、stdout、およびstderrで特定のタスクを実行する必要がある問題が発生する可能性があります。 SIGHUPや他の信号を無視することもできます(必要ありません)。

おすすめ記事