基本プロセスが終了したら、サービスを再起動します。

基本プロセスが終了したら、サービスを再起動します。

使っています連載物の確保デバイスのシリアルデータを記録します。次の資料に記載されている指示に従って、連続ロギングサービスを設定しました。連続録音

Grabserialツールには、出力が指定された文字列と一致する場合にプログラムを終了するオプションがあります。たとえば、Grapserialが「Exit」で始まる行を読み取ると、次のコマンドは終了します。

grabserial -q "^Exit" -d /dev/ttyUSB0

だから私の質問は、基本プロセスgrpserialが終了したときに(シリアルポートの「終了」文字列を検出した後)、サービスをどのように再起動しますか?

私についてのドキュメントを読んだ。システムサービスなど、さまざまなオプションを試しましたが、KillMode=mixedそのどれも私には役に立ちませんでした。プロセスを手動で終了するとサービスは再sudo kill [PID of grabserial]起動されますが、文字列の一致に応じてGrapserialが終了すると、サービスは再起動せずに実行を続けます。

以下は私のサービスファイルです。上記のドキュメントと同じサービスファイルを使用しました - パラメータのみを追加q "^Exits"しました。

[Unit]
Description=Serial Data Logging Service
After=sys-devices-pci0000:00-0000:00:1c.3-0000:07:00.0-usb3-3\x2d1-3\x2d1:1.0-ttyUSB0-tty-ttyUSB0.device
BindsTo=sys-devices-pci0000:00-0000:00:1c.3-0000:07:00.0-usb3-3\x2d1-3\x2d1:1.0-ttyUSB0-tty-ttyUSB0.device

[Service]
Type=simple
GuessMainPID=no
KillMode=process
Environment=PYTHONIOENCODING=utf-8
ExecStart=/usr/local/bin/grabserial -v -Q -q "^Exit" -d /dev/ttyUSB0 -b 115200 -o "/var/grabserial/LoggingData-%%Y%%m%%d.log" -A
TimeoutSec=2
Restart=on-failure
RestartPreventExitStatus=2 3
StandardInput=null
StandardOutput=syslog
StandardError=syslog+console
SyslogIdentifier=GrabSerial
User=grabserial
Group=grabserial
SupplementaryGroups=dialout
PermissionsStartOnly=true

[Install]
WantedBy=sys-devices-pci0000:00-0000:00:1c.3-0000:07:00.0-usb3-3\x2d1-3\x2d1:1.0-ttyUSB0-tty-ttyUSB0.device
WantedBy=multi-user.target

ベストアンサー1

だから私の質問は、基本プロセスgrpserialが終了したときに(シリアルポートの「終了」文字列を検出した後)、サービスをどのように再起動しますか?

あなたはそれを使用することができますRestart=always

man systemd.service示す:

          Table 2. Exit causes and the effect of the Restart= settings on them
           ┌──────────────┬────┬────────┬────────────┬────────────┬─────────────┬──────────┬─────────────┐
           │Restart       │ no │ always │ on-success │ on-failure │ on-abnormal │ on-abort │ on-watchdog │
           │settings/Exit │    │        │            │            │             │          │             │
           │causes        │    │        │            │            │             │          │             │
           ├──────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
           │Clean exit    │    │ X      │ X          │            │             │          │             │
           │code or       │    │        │            │            │             │          │             │
           │signal        │    │        │            │            │             │          │             │
           ├──────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
           │Unclean exit  │    │ X      │            │ X          │             │          │             │
           │code          │    │        │            │            │             │          │             │
           ├──────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
           │Unclean       │    │ X      │            │ X          │ X           │ X        │             │
           │signal        │    │        │            │            │             │          │             │
           ├──────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
           │Timeout       │    │ X      │            │ X          │ X           │          │             │
           ├──────────────┼────┼────────┼────────────┼────────────┼─────────────┼──────────┼─────────────┤
           │Watchdog      │    │ X      │            │ X          │ X           │          │ X           │
           └──────────────┴────┴────────┴────────────┴────────────┴─────────────┴──────────┴─────────────┘

ここでそのエントリがあり、正常な状態で再起動するには、on-failure条件を追加する grabserial必要があります。あなたに最適です。on-successalways

-aまた、から削除する場合にのみ機能すると指摘しましたgrabserial

おすすめ記事