の出力を記録する必要があります/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
以前の環境変数は使用できなくなり、パラメータを介してインポートする必要があります。