マルフット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
再起動すると、サービスが失敗するようにする必要があります。