USB デバイスが取り外されると、Systemd サービスは自動的に無効になります。

USB デバイスが取り外されると、Systemd サービスは自動的に無効になります。

シリアルポートを介して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-tmArduinoを切断して再接続すると、端末で実行が終了しないことです。

それでは、自動サービスを無効にする理由は何ですか? Rubyスクリプトが実行されるたびにサービスを実行したいと思います。

ベストアンサー1

ターミナルでプログラムを実行すると、現在のttyは制御ターミナルなので、新しいttyを開いてもこれは変わりません。 systemdで実行している場合は制御端末がないため、open(2)シリアルポートにある場合は制御端末になります。プロセスが端末制御を失うと、SIGHUPを受け取ります。O_NOCTTYこれを防ぐには、フラグを追加する必要があります。man openロゴ情報は次のとおりです。

O_NOCTTY.パス名が端末装置を参照している場合(tty(4)を参照)、プロセスに制御端末がない場合でも、その経路はプロセスの制御端末になりません。

おすすめ記事