systemdを使用して特定のタイムスタンプで実行するようにコマンドをスケジュールする

systemdを使用して特定のタイムスタンプで実行するようにコマンドをスケジュールする

Unixタイムスタンプで識別される特定の時間にコマンドが実行されるようにスケジュールしたいと思います。これはsystemdを使用して達成できるようですが、systemd-runどのように機能しますか?コマンドの予約中にシステムの電源が切れたり一時停止したりすると、スケジュールされたコマンドはどうなりますか?

at関連質問:fromを使用して同じ操作を実行するatd(現在までのタイムスタンプを解析する必要があります):atコマンドを使用して特定のタイムスタンプでジョブを実行するようにスケジュールできますか?

ベストアンサー1

systemd-run特定の時間にコマンドを実行するようにスケジュールできます。をする:

  • 一時的なタイマーとサービスファイルが/ runに書き込まれ、再起動時に消去されるため、システムはそれまで電源を切らない。
  • 「WakeSystem」オプション(以下を参照)を使用しない限り、システムはこの特定の時間中に一時停止しません。

再起動の永続性オプションについては、以下を参照してください。

簡単な例systemd-run:

# generate an arbitrary timestamp, in seconds-since-the-epoch
timestamp=$(date -d 'now + 42 seconds' +%s)
systemd-run --on-calendar "$(date -d @"$timestamp" +'%F %T')" \
  --timer-property=AccuracySec=1us \
  touch /tmp/done

systemd-runエポック以降の秒単位のタイムスタンプを使用する上で重要な部分は次のとおりです。

  • 使用--on-calendar
  • ここで、GNU日付は、エポックタイムスタンプの後の秒をsystemd-run理解できる形式に変換するために使用されます。結果が次の場合は、タイムスタンプを直接入力または変換できます。OnCalendarが理解する形式

OnCalendarの現在のドキュメントは、epochタイムスタンプ以降の秒単位の入力を直接サポートしていることを示しています。 「@seconds」のサポートが追加されました。システムバージョン234(このページでファイルを検索してくださいsrc/basic/calendarspec.c送信済み80e5b7。システムのバージョンがこれより先に変更された可能性があります。

  • RHEL 7はsystemd 208で始まり、後でバージョン219にアップグレードされました。 RHEL 8はバージョン239(引用する)。
  • Debian 8はバージョン215を使用し、Debian 9はバージョン232を使用し、Debian 10はバージョン241(引用する)。
  • Ubuntu 16.04 LTSはバージョン229、Ubuntu 17.10はバージョン234、Ubuntu 18.04 LTSはバージョン237(引用する)。

まったく新しいシステムバージョンでは、次の呼び出しを使用できます。

timestamp=$(date -d 'now + 42 seconds' +%s)
systemd-run --on-calendar "@${timestamp}" \
  --timer-property=AccuracySec=1us \
  touch /tmp/done

私もAccuracySecのタイマー属性、デフォルトは1分です。マニュアルに従って値を調整する必要があります。

消費電力を最適化するには、この値をできるだけ高く設定し、必要に応じて低く設定してください。

まだテストしていませんが、次のタイマーオプションもありますWakeSystem

サスペンド状態でシステムを再開します(システムがサスペンドされ、システムがこのタスクをサポートしている場合)。このオプションは、システムが適切な時間に再起動されることを保証し、実行する操作が完了した後にシステムを再び停止しないことに注意してください。

上記のように、次のように統合できます。

timestamp=$(date -d 'now + 42 seconds' +%s)
systemd-run --on-calendar "$(date -d @"$timestamp" +'%F %T')" \
  --timer-property=AccuracySec=1us \
  --timer-property=WakeSystem=true \
  touch /tmp/done

特定の時間にコマンドを実行するように systemd に要求します。再起動後もまだ存在する、特定のログインセッションに関係なく、タイマーとサービスユニットファイルを/etc/systemd/system//etc/systemd/system は、ローカル構成が保存される場所です。システムのため。

サンプルタイマーファイルは次のとおりです。

[Timer]
AccuracySec=1us
[Unit]
Description=2020-01-22 09:50:00 timer
[Timer]
OnCalendar=2020-01-22 09:50:00

サンプルサービスファイルは次のとおりです。

[Unit]
Description=my 2020-01-22 09:50:00 service
[Service]
ExecStart=
ExecStart=@/usr/bin/bash "/usr/bin/bash" "-c" "echo 2020-01-22 09:50:00 timer and service ran > /tmp/done"

その後、そのファイルを再ロードしてsystemdに通知できます。

systemctl daemon-reload

...そしてタイマーを有効にします。

systemctl enable foo.timer

...そしてタイマーを始めます。

systemctl start foo.timer

時間が経つと、/ etc / systemd / systemから期限切れのタイマーとサービスユニットを定期的に削除する必要があります。

おすすめ記事