systemdタイマーを使用して、毎日異なる正確な時刻にユーティリティを起動し、パラメータを渡します。

systemdタイマーを使用して、毎日異なる正確な時刻にユーティリティを起動し、パラメータを渡します。

マルフットMeteor 2衛星からデータをキャプチャするためのコマンドラインユーティリティ。衛星は毎日異なる時間にオーバーヘッドを送信し、システムタイマーを使用してmlrpt正しいパラメータで起動したいと思います。

APIから取得した時間から始まります。

    startDate start_times end_times duration
1  2019-08-25       17:51     18:05       14
2  2019-08-25       19:31     19:45       14
3  2019-08-26       05:07     05:21       14
4  2019-08-26       06:47     07:01       14
5  2019-08-26       19:11     19:25       14
6  2019-08-27       06:27     06:42       15
7  2019-08-27       18:51     19:06       15
8  2019-08-28       06:07     06:22       15
9  2019-08-28       18:31     18:46       15
10 2019-08-29       05:47     06:02       15
11 2019-08-29       18:11     18:26       15
12 2019-08-30       05:27     05:42       15
13 2019-08-30       17:51     18:06       15
14 2019-08-30       19:31     19:45       14
15 2019-08-31       05:08     05:22       14
16 2019-08-31       06:48     07:02       14
17 2019-08-31       19:11     19:26       15
18 2019-09-01       06:27     06:42       15
19 2019-09-01       18:51     19:07       16
20 2019-09-02       06:07     06:23       16
21 2019-09-02       18:31     18:47       16
22 2019-09-03       05:47     06:03       16

mlrptを実行したいすべてのフォーマットについてmlrpt $startT-$stopT -t $durationMin

このサービスファイルから始めます。

~/.config/systemd/user/mlrpt.service
[Unit]
Description=Capture Meteor satellite data using mlrpt
DefaultDependencies=no
Wants=local-fs.target time-sync.target
After=local-fs.target time-sync.target

[Service]

Type=simple
ExecStart=/usr/local/bin/mlrpt $START_TIME-$END_TIME -t $DURATION

mlrptタイマーファイルが適切な時間に開始されるだけでなく、正しいパラメータをユーティリティに渡すように(毎回異なる)タイマーファイルをどのように設定しますか?似たようなテンプレートが必要だと思います。

~/.config/systemd/user/mlrpt.timer
[Unit]
Description=Run mlrpt when a satellite is overhead

[Timer]
OnCalendar=
Persistent=true

[Install]
WantedBy=timers.target

しかし、次にどこに行くべきかわかりません。正しいタイマーファイルの例がある場合は、タイマーファイルを生成するスクリプト技術があります。

答え1

これらのワンタイム非反復作業の場合、より良い解決策が見つかったようですsystemd-run。リストの最初の項目に対して実行するスクリプトを作成します。systemd-run --user --on-calendar="2019-08-25 19:51" /usr/local/bin/mlrpt "17:51-18:05" -t 14

答え2

別のアプローチは、タイマーなしで複数の要素を単一のサービスファイルに結合することです。これらの要素は次のとおりです。

  • 「mlrpt-textfile」でカスタムvarenvでエンコードされた単一の衛星チャンネルのmlrptパラメータを読み取るための指示を持つ「自己再起動」Type=oneshotサービス。EnvironmentFile=/path/to/mlrpt-textfileパラメータは1)$ START_TIMEと2)$ END_TIME(衛星転送の場合)、3)転送$ DURATION、4)次の転送まで$ WAITです。

  • 2つのテキストファイル。たとえば、「mlrpt-list」という項目には、22項目のリストと似ていますが、同じではないカスタムmlrptパラメータの完全なリストが含まれています。 1つの項目のみを含む別のテキストファイル(上記の「mlrpt-textfile」です)

  • 「mlrpt-list」の先頭から最初の項目を読み、それを「mlrpt-textfile」にコピーしてから「mlrpt-list」の最初の項目を削除し、次の手順を繰り返すメカニズム(簡単なスクリプトを含む)」 mlrpt-list"にエントリがなくなるまで必要です(注: "mlrpt-textfile"にコピーすると追加されず、上書きする必要があります)。

これで、oneshot-serviceファイルは3つの要素をすべて機能するソリューションにまとめており、おおよそ次のようになります。ワンショットを使用する主な理由は、1つのコマンドだけでなく複数のExecStart=コマンドを受け入れることができることです。設計上、これらのExecStartコマンドは順番に実行されます。これにより、単一の使い捨てサービスユニットを介して上記の「メカニズム」を生成し実行することができる。

# /etc/systemd/system/myservice.service

[Unit]
Description=my service Service
ConditionPathExists=/path/to/mlrpt-textfile # contains $START_TIME, $END_TIME, $WAIT,     
                                            # and $DURATION for a single pass
ConditionFileNotEmpty=/path/to/mlrpt-textfile
EnvironmentFile=/path/to/mlrpt-textfile

[Service]
Type=oneshot
ExecStart=/usr/local/bin/mlrpt $START_TIME-$END_TIME -t $DURATION
ExecStart=/bin/sleep $WAIT
ExecStart=/path/to/script # script copies one entry from mlrpt-list to mlrpt-textfile
ExecStopPost=/bin/systemctl restart myservice.service

[Install]

もちろん、これにはさらに改善が必要です(たとえば、必要に応じて依存関係を追加する必要があります)。このスクリプトは、最後のパスの後にサービスが失敗するようにするためにも使用する必要があります。たとえば、最後のパスの後に「mlrpt-textfile」のエントリを消去してConditionFileNotEmpty再起動すると、サービスが失敗するようにする必要があります。

関連情報