特定のUSBドライブが挿入されるたびにログファイルに書き込むudevルールセットの作成に取り組んでいます。 /etc/udev/rules.d /99-log-USB-drive.rules
に保存されている私のルールセットには、現在次のものが含まれています。
# Skip if not the expected USB drive
ENV{ID_FS_UUID}!="SOMEUUID", GOTO="end"
# Try different ways of interacting with the file system
ACTION=="add", RUN+="/usr/bin/touch /home/myusername/udevtest.txt"
ACTION=="add", RUN+="/bin/chmod 664 /home/myusername/udevtest.txt"
ACTION=="add", RUN+="/bin/echo 1 | /usr/bin/tee /home/myusername/udevtest.txt"
ACTION=="add", RUN+="/bin/echo 2 >> /home/myusername/udevtest.txt"
# Exit
LABEL="end"
Touchコマンドとchmodコマンドはどちらも期待どおりに機能しますが、ファイルに書き込もうとしても何も得られません。を使用してudevのデバッグを有効にする
udevadm control --log-priority=debug
次の出力を/var/log/syslog
にレンダリングします。
Dec 3 18:00:49 Hostname systemd-udevd[9629]: starting '/bin/echo 1 | /usr/bin/tee /home/myusername/udevtest.txt'
Dec 3 18:00:49 Hostname systemd-udevd[9612]: '/bin/echo 1 | /usr/bin/tee /home/myusername/udevtest.txt'(out) '1 | /usr/bin/tee /home/myusername/udevtest.txt'
Dec 3 18:00:49 Hostname systemd-udevd[9612]: Process '/bin/echo 1 | /usr/bin/tee /home/myusername/udevtest.txt' succeeded.
Dec 3 18:00:49 Hostname systemd-udevd[9630]: starting '/bin/echo 2 >> /home/myusername/udevtest.txt'
Dec 3 18:00:49 Hostname systemd-udevd[9612]: '/bin/echo 2 >> /home/myusername/udevtest.txt'(out) '2 >> /home/myusername/udevtest.txt'
Dec 3 18:00:49 Hostname systemd-udevd[9612]: Process '/bin/echo 2 >> /home/myusername/udevtest.txt' succeeded.
uSBドライブの挿入時。そのため、コマンドは成功しますが、何らかの理由で出力がファイルに書き込まれません。 This 質問は、ファイルへの書き込みが機能するはずであることを示しています。
このプロジェクトの要件の1つは、ファイルにアスタリスク(*
)を書き込める必要があることです。 @Kamil Maciorowskiによる優れた回答からの情報を使用して、ファイルに書き込むことはできますが、シェルがアスタリスクを展開するのを防ぐことはできません。
ACTION=="add", RUN+="/bin/sh -c 'echo * >> /home/myusername/udevtest.txt'"
uSBドライブの挿入時に、ルートフォルダの内容のリストをファイルに書き込みます。
ACTION=="add", RUN+="/bin/sh -c 'echo "*" >> /home/myusername/udevtest.txt'"
ファイルに何も書き込まず、次の出力を/var/log/syslog
にレンダリングします。
Jan 1 12:26:45 Hostname systemd-udevd[12359]: starting '/bin/sh -c 'echo '
Jan 1 12:26:45 Hostname systemd-udevd[12346]: '/bin/sh -c 'echo '(out) ''
Jan 1 12:26:45 Hostname systemd-udevd[12346]: Process '/bin/sh -c 'echo ' succeeded.
一方
ACTION=="add", RUN+="/bin/sh -c 'echo '*' >> /home/myusername/udevtest.txt'"
また、ファイルには何も書き込まず、次の出力を/var/log/syslog
にレンダリングします。
Jan 1 12:30:48 Hostname systemd-udevd[12477]: starting '/bin/sh -c 'echo '*' >> /home/myusername/udevtest.txt''
Jan 1 12:30:48 Hostname systemd-udevd[12464]: '/bin/sh -c 'echo '*' >> /home/myusername/udevtest.txt''(out) ''
Jan 1 12:30:48 Hostname systemd-udevd[12464]: Process '/bin/sh -c 'echo '*' >> /home/myusername/udevtest.txt'' succeeded.
|
、>>
などの演算子は、シェル内で何かを意味しますが、唯一の/bin/echo 1 | …
が実行されると、シェルは存在せず、|
はecho
自体に対する単なる別の引数です。 。
これらの演算子を使用するには、それらを解析するシェルを開始する必要があります。これは機能するはずです:
…
ACTION=="add", RUN+="/bin/sh -c 'echo 1 | /usr/bin/tee /home/myusername/udevtest.txt'"
ACTION=="add", RUN+="/bin/sh -c 'echo 2 >> /home/myusername/udevtest.txt'"
…
ここでは、/bin/echo
ではなくecho
(シェル組み込み)を選択しました。
または 1つのシェルスクリプト(適切なシバンを使用)にいくつかのコマンド(またはすべて)を収集し、ルールセットからスクリプトのみを実行できます。それは次のようになります:
#!/bin/sh
logfile="/home/myusername/udevtest.txt"
# /usr/bin should be in the defalut $PATH,
# so you probably don't need full paths to executables here
touch "$logfile"
chmod 664 "$logfile"
echo 1 | tee "$logfile"
echo 2 >> "$logfile"
スクリプトを実行可能にすることを忘れないでください。次に、ルールセットで:
…
ACTION=="add", RUN+="/path/to/the/script"
…
Udevdが実行を開始しても、rootfsは読み取り専用オプションでマウントされます。したがって、udevRUNキーを使用してファイルに変更することはできません。
起動プロセスは次のとおりです。 init->カーネル仮想ファイルシステムのマウント(etc./run /)-> udev running-> mount all(/ etc/fstab)
私自身の質問の補遺に答える:アスタリスクのエスケープは機能します。
ACTION=="add", RUN+="/bin/sh -c 'echo \* >> /home/myusername/udevtest.txt'"
ファイルにアスタリスクを書き込みます。