シリアル接続からデータを読み取るために、単純な.shを起動するシステムサービスを作成しました。起動後に手動でサービスを実行すると正常に動作しますが、起動時に自動的に実行しようとするとawk: fatal: cannot open file /dev/ttyUSB0' for reading (No such file or directory
ttyUSB0() で .sh をまだ読み取れないため失敗します。
サービスにttyUSB0を待ってから.shを実行させる方法はありますか? after = ttyUSB0のようなものを試しましたが、うまくいきませんでした。
[Unit]
Description=Serial logger
[Service]
ExecStart=/serial_script.sh
[Install]
WantedBy=default.target
ベストアンサー1
スクリプトを実行するには、サービスの代わりにルールを使用すること。大丈夫です。 udevで長期実行プロセスを開始することはお勧めできません。最新のudevバージョンでは、udevトランザクションとそれによって生成されたプロセスに厳密なタイムアウトを設定することで、これを防ぐために積極的に試すことができるためです。udev
をお勧めしますsystemd
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