ttyUSB0が利用可能になった後にサービスを実行する

ttyUSB0が利用可能になった後にサービスを実行する

シリアル接続からデータを読み取るために、単純な.shを起動するシステムサービスを作成しました。起動後に手動でサービスを実行すると正常に動作しますが、起動時に自動的に実行しようとするとawk: fatal: cannot open file /dev/ttyUSB0' for reading (No such file or directoryttyUSB0() で .sh をまだ読み取れないため失敗します。

サービスにttyUSB0を待ってから.shを実行させる方法はありますか? after = ttyUSB0のようなものを試しましたが、うまくいきませんでした。

[Unit] 
Description=Serial logger

[Service] 
ExecStart=/serial_script.sh

[Install] 
WantedBy=default.target

ベストアンサー1

スクリプトを実行するには、サービスの代わりにルールを使用することudevをお勧めしますsystemd。大丈夫です。 udevで長期実行プロセスを開始することはお勧めできません。最新のudevバージョンでは、udevトランザクションとそれによって生成されたプロセスに厳密なタイムアウトを設定することで、これを防ぐために積極的に試すことができるためです。

systemdただし、udevでこれを行う必要がある場合(たとえば、以前のバージョンを含む古いシステムでは)、次の方法を使用できます。/etc/udev/rules.d/99-serial-logger.rules

SUBSYSTEM=="tty", ACTION=="add", KERNEL=="ttyUSB0", RUN+="/serial_script.sh"

これをシステムサービスとして実装する場合(現在推奨されている方法)、WantedBy=default.targetサービスからこの行を削除してudev次の規則を作成します。

SUBSYSTEM=="tty", KERNEL=="ttyUSB0", TAG+="systemd", ENV{SYSTEMD_WANTS}+="your-serial-logger.service"

したがって、デバイスが表示されたらサービスを開始し、デバイスが削除されたらサービスを停止するように指示するudev必要があります。systemd

おすすめ記事