スクリプトはudevによってトリガされ、永久に実行されます。

スクリプトはudevによってトリガされ、永久に実行されます。

の出力を記録する必要があります/dev/ttyUSB0。これが接続から起動ログスクリプトを起動する方法です。

pi@raspberrypi:/etc/udev/rules.d $ cat 50-text-log.rules 
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", RUN+="/bin/bash /scripts/start-log"

/dev/ttyUSB0 > somefile/ devでパスを見つけることに加えて、デフォルトで行うことはcatです。

ただし、これによりこのメッセージが表示されます。service udev status

raspberrypi systemd-udevd[4990]: Spawned process '/bin/bash /scripts/start-log' [5018] is taking longer than 59s to complete

私はこれを試しました:Udevイベントで長いプロセスを実行するには?

デュアルフォークを使用すると、すでに8秒後に停止し、状況がさらに悪化します。次のようにcgroupを変更します。 (echo $$ >> /sys/fs/cgroup/cpu/tasks上記のリンクに記載されている内容をbashからコピーしてみてください。)何も変更されず、8秒後もそのまま残ります。

USBデバイスが接続されたときに永久に実行されるスクリプトを起動するにはどうすればよいですか?

/etc/systemd/systemまたは(「デバイス単位」)で.deviceファイルを使用してこれを行うにはどうすればよいですか?これに関する情報が少なすぎます。

ベストアンサー1

この問題は systemd サービスを使用して最終的に解決されました。


59秒以上実行されない古いコンテンツは次のとおりです。

以前の udev ルール

猫/etc/udev/rules.d/50-text-log.rules

ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", RUN+="/bin/bash /scripts/start-log"

古いスクリプト

/スクリプト/startlog

BASENAME="$(basename $DEVPATH)"
DEVICE="/dev/$BASENAME"
cat "${DEVICE}" >> somefile

これで15分ほど実行されました。

新しいudevルール

猫/etc/udev/rules.d/50-text-log.rules

ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ENV{SYSTEMD_WANTS}="log@$env{DEVPATH}.service"

$env{DEVPATH} は、$1 bash 変数の一般的なコマンドライン引数としてサービスに渡されます。

新しいサービス

/etc/systemd/system/[Eメール保護]

[Service]
Type=simple
TimeoutSec=0
GuessMainPID=false
ExecStart=/bin/bash -c "/scripts/start-log %I"

またはを使用することもできますTimeoutSec=infinity。これは永続的な実行設定の最新のバリエーションのようです。しかし、=0それは私に効果があったので、私はそれを試していませんでした。 (略語で設定を確認して続行してman systemd.serviceください)。まだ再起動する必要があると思います。TimeoutStopSec=TimeoutSec=

新しいスクリプト

DEVPATH=$1
BASENAME="$(basename $DEVPATH)"
DEVICE="/dev/$BASENAME"
cat "${DEVICE}" >> somefile

以前の環境変数は使用できなくなり、パラメータを介してインポートする必要があります。

おすすめ記事