使っています連載物の確保デバイスのシリアルデータを記録します。次の資料に記載されている指示に従って、連続ロギングサービスを設定しました。連続録音
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
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-success
always
-a
また、から削除する場合にのみ機能すると指摘しましたgrabserial
。