起動(または再起動/終了)時にスクリプトを実行する最も簡単な方法ですが、今日実行されていない場合にのみ可能ですか?

起動(または再起動/終了)時にスクリプトを実行する最も簡単な方法ですが、今日実行されていない場合にのみ可能ですか?

あなたが知っている最も簡単な方法は何ですか?どんなツールを使っても

答え1

スクリプトの先頭でどこかにフラグをタッチすると、スクリプトへの後続の呼び出しでフラグの存在と寿命を確認できます。

あなたの質問は多少曖昧です。まず、「最後にスクリプトを実行してから一定時間が経過した後にのみスクリプトを実行させる方法」を尋ねるとしましょう。

#!/bin/bash
flag="/var/tmp/$(basename -- $0).flag"
min_age=$(( 60 * 60 * 24 )) # 24 hours

if [ -e "$flag" ] ;then
  (( $(date +%s) - $(date +%s -r "$flag") > min_age )) || exit 1
fi
touch "$flag"

# Proceed with your script
# ...

しかし、「真夜中以降にスクリプトが実行されていない場合にのみスクリプトを実行するにはどうすればよいですか?」と尋ねられます。

#!/bin/bash
flag="/var/tmp/$(basename -- $0).flag"

if [ -e "$flag" ] ;then
  [ $(date +%F) = $(date +%F -r "$flag") ] && exit 1
fi
touch "$flag"

# Proceed with your script
# ...

-

「終了時にスクリプトを実行する方法」を尋ねると、ディストリビューションによって状況が大きく異なります。あなたはおそらくそれを調べたいと思うでしょう/etc/rc6.d。たとえば、自分のシステムに/etc/rc.d/rc.local_shutdownコンテンツを追加できます。使用しているディストリビューションに言及する必要があります。

それともこのスレッドをチェックしてください... 終了する前にコマンドを実行する

答え2

最も簡単大きな問題です。よりしかし、最も簡単な方法はを使用することですcron。目標を達成するには別の「コンポーネント」が必要ですが、タイムアウト開始スクリプトとして機能するcronスケジューラが必要ですboot。これはcron、システムバージョンがこの@reboot機能を提供すると仮定します。 「特殊」文字列(など)が許可されていることを確認するman 5 crontabを参照してください。@reboot@yearly

つまり、コマンドラインでcronユーザーの編集と同じように使用します。crontabbash

$ crontab -e

これでcrontabデフォルトエディタが開きます。次の行を追加します。

@reboot sleep 15; /path/to/your/script >> /path/to/your/iofile.txt 2>&1

システムが起動するたびにスクリプトが実行されます。

  • cronスクリプトに必要なサービスの状態がわからないため、このコマンドsleep 15はオペレーティングシステムに必要なすべてのシステムリソースをマーシャリングするために15秒を提供するために使用されます。必要なリソースやその他の変数によっては、これより多くまたは少なくする必要があります。

  • crontab以下では、フルパスを使用してください。環境(特にPATH)対話型シェルとは異なります。

  • スクリプトの出力はstderr次のstdoutとおりです。リダイレクトローカルファイル(ioファイル.txtここ)。これioファイル.txtこのファイルは、スクリプトで発生したエラーに簡単にアクセスできる方法を提供します。デバッグに非常に便利です!

スクリプトを実行するための条件の適用を要求されました@reboot「しかし、今日実装されていない場合のみ」。これは、以下があることを意味します。ユーザーがスクリプトを手動で実行した可能性あるいは、同じ日以前にシステムが再起動された可能性があります。

もちろん、その条件を満たすことはあなたの定義に依存します。「今日」;つまり、過去24時間以内の「今日」または同じ日付の「今日」です。

この場合today=24 hours or less、あなたの条件は以下を満たすことができます:

#!/bin/bash
LAST_BOOT=$(cat /path/to/your/timestamp.txt)
CURRENT_BOOT=$(date +%s)
ELAPSED_TIME=$((CURRENT_BOOT - LAST_BOOT))
echo $CURRENT_BOOT > /path/to/your/timestamp.txt
# test ELAPSED_TIME < threshold
if [ $((ELAPSED_TIME <= 86400)) ]; then exit; fi

# the balance of your script follows...

エポック時間は、次の+%s形式を使用して提供されますdateマイナス2回の起動時間が24時間(86,400秒)であることを確認してください。

この場合today=same date、あなたの条件は以下を満たすことができます:

#!/bin/bash
LAST_BOOT=$(cat /path/to/your/timestamp.txt)
CURRENT_BOOT=$(date +%d)
# test for same date
if [ $((CURRENT_BOOT = LAST_BOOT)) ]; then exit; fi 

# the balance of your script follows...

date +%d形式は日付のみを提供します。最後の開始時刻とステートメントの現在時刻が等しいかどうかをテストします。ifこれは、スクリプトがその日に実行されたことを意味します。

または:

先ほど作成したすべてのコメントを考慮した後、しばらく考えてみることをお勧めしますanacron。広く使用されていませんが、スケジュールがあるというcron利点があります。@daily「システムの起動時に実行されるように、ジョブを別の瞬間に移動してください。」。比較してみることもできます。利点、そして欠点と比較してcron。もっと深く掘りたいなら、これが役に立つかもしれません

答え3

あなたは使用を検討することができますナクロン

Anacronを使用すると、常にオンになっていないコンピュータで繰り返しタスクをスケジュールできます。これを達成するために、ジョブが最後に実行された時刻を記録するいわゆるタイムスタンプファイルを維持します。コンピュータの電源を入れると、anacronはさまざまなメカニズム(起動スクリプト、通常のクローン操作、システムタイマー)を介して定期的にトリガされ、タイムスタンプファイルに基づいてスケジュールされたタスクを開始します。

anacronを使用して1日に1回コマンドを実行するには、次の行を入力する必要があります/etc/anacrontab

@daily  0   daily-job   command
  • 最初のフィールドは頻度で@daily@weeklyまたは @monthly任意の日数(たとえば、22日ごと)にすることができます。

  • 2番目のフィールドは、ジョブの実行を開始するためにアナクロンがトリガーされた後の遅延です。

  • 3番目のフィールドは役職です。

  • 最後に、4番目のフィールドは実行するコマンドです。

/etc/cron.dailyDebian派生製品では、anacron(インストールされている場合)がデフォルトで毎日、毎週、および毎月cronジョブを実行するジョブに代わるので、スクリプトをそこに配置できます。

別のオプションはフルロン、同じこと(またはそれ以上)を実行できますが、それに対する個人的な経験はありません。

関連情報