
シリアルポートを介してArduinoと通信するタスクマネージャがあり、ArduinoにはシステムのCPU、メモリ、スワップ、ネットワークのダウンロード/アップロード、ディスクの読み取り/書き込み使用量を示すOLEDディスプレイがあります。
サービスはRubyで書かれており、決して終了しません。 Arduinoを取り外して再接続すると、サービスはそれを検出します。
起動時にRubyスクリプトを有効にするには、次のsystemdサービスがあります。
[Unit]
Description=Arduino OLED as a Ultra Light-Weight System Monitor
[Service]
ExecStart=/bin/ruby /root/.local/share/gem/ruby/3.0.0/bin/blink-tm
Restart=on-failure
User=root
Group=root
[Install]
WantedBy=multi-user.target
起動するとうまくいきます。しかし、Arduinoのプラグを抜くと、コードが機能する必要があるにもかかわらず、デバイスはまだ無効になります!Type=oneshot
、、、Type=simple
そして追加も試しましたが、Type=forking
運がありませんでした。
ArduinoがPCから切断されたときのサービス状態は次のとおりです。
○ blink-tm.service - Arduino OLED as a Ultra Light-Weight System Monitor
Loaded: loaded (/usr/lib/systemd/system/blink-tm.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Wed 2021-07-14 13:02:33 IST; 3min 30s ago
Process: 3502 ExecStart=/bin/ruby /root/.local/share/gem/ruby/3.0.0/bin/blink-tm (code=exited, statu>
Main PID: 3502 (code=exited, status=0/SUCCESS)
CPU: 115ms
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.41: A potential device discovered: 1a86:7523
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.41: Changing baudrate to 57600...
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.41: Successfully Changed baudrate to 57600...
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.41: No device found. Retrying 2
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.91: A potential device discovered: 1a86:7523
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.91: Changing baudrate to 57600...
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.91: Successfully Changed baudrate to 57600...
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:33.41: Device discovered successfully. Path: /dev/ttyUSB0
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:33.66: Device ready!
Jul 14 13:02:33 archlinux systemd[1]: blink-tm.service: Deactivated successfully.
前述のように、Rubyスクリプトは決して失敗しません。標準出力で何かを印刷します。 1つの例は、/bin/ruby /root/.local/share/gem/ruby/3.0.0/bin/blink-tm
Arduinoを切断して再接続すると、端末で実行が終了しないことです。
それでは、自動サービスを無効にする理由は何ですか? Rubyスクリプトが実行されるたびにサービスを実行したいと思います。
答え1
ターミナルでプログラムを実行すると、現在のttyは制御ターミナルなので、新しいttyを開いてもこれは変わりません。 systemdで実行している場合は制御端末がないため、open(2)
シリアルポートにある場合は制御端末になります。プロセスが端末制御を失うと、SIGHUPを受け取ります。O_NOCTTY
これを防ぐには、フラグを追加する必要があります。man open
ロゴ情報は次のとおりです。
O_NOCTTY.パス名が端末装置を参照している場合(tty(4)を参照)、プロセスに制御端末がない場合でも、その経路はプロセスの制御端末になりません。