systemdで1日に1回スクリプトを実行する


13

マシンを起動してから10分後に1日1回だけバックアップスクリプトを実行したい。systemdでそのようなシナリオを構築することは可能ですか?


3
要件を完全に理解していないため、明確にしてください。マシンを1日数回リブートする場合、スクリプトは最初のリブート後にのみ実行されるべきだと理解しています、そうですか?マシンが1日以上実行されている場合、連続した日にスクリプトを実行する必要がありますか?
レジストフアダムスキー

丁度。PCを再起動する頻度に関係なく、毎日バックアップを作成します。
-Fu86

5
systemdでハングアップしていない場合、これがまさにanacronの目的です。
ジル 'SO-悪であるのをやめる

間違っているかもしれませんが、ブートが完了してからわずか10分後にスクリプトを実行するようにanacronを設定する簡単な方法はありません。
レジストフアダムスキー

そのとおり。だから、私は現在anacronと古き良き時代を使って、毎日の仕事でecho "obnam backup" | at "now + 10 minutes"
Adrien Clerc

回答:


10

参照/lib/systemd/system/systemd-tmpfiles-clean.timer::

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

これにより、対応する.serviceファイルが起動後15分で実行され、その後システムが稼働している間は毎日実行されます。同じ日に複数回リブートする場合は、バックアップスクリプトにアーカイブのmtimeをチェックさせ、1日未満であればその実行をスキップすることができます。

また、バックアップのIOが重くなる場合は、systemd.exec(5)マンページのIOScheduling *ディレクティブについて読むと役立つ場合があります。


5

再起動間の状態を追跡しないため、systemdでこれを完全に行うことは不可能だと思います。あなたはイースリー使用して、起動後10分を実行するために何かをスケジュールすることができsystemd.timer、そのOnBootSec=OnStartupSec=

スクリプト自体は、今日実行されたかどうかを確認する必要があります。これは、たとえばbashでも簡単に実装できます。

#/bin/sh -x
FILE=/etc/lastrun
TODAY=`date +"%Y%m%d"`
LASTRUN=`cat $FILE`

[[ -z "$LASTRUN" ]] || [[ "$TODAY" -gt "$LASTRUN" ]] || exit
echo $TODAY > $FILE
RUNYOURSCRIPTHERE

1

起動後10分間電話を切らない場合、次のことができます。

[Unit]
Description=...

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

OnCalendar=dailyPersisten=true少なくとも1回実行に失敗した場合は、ブート時に毎晩実行します。


0

どうやらこの問題は将来のリリースで対処されるようです。少なくともsystemd-develメーリングリストのこのメールによると。それまでは、Krzysztofが提案したハック的な方法に進まなければなりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.