稼働時間が72時間を超えているかどうかを確認するには?

稼働時間が72時間を超えているかどうかを確認するには?

毎日実行し、システムの稼働時間を計算し、稼働時間が72時間を超える場合は、システムを再起動するスクリプト(cronジョブ)を作成する必要があります。

時間値を72と比較できる値に変換する方法を失いました。それは私を再び連れてくる6499.04: command not found

#!/bin/bash
if $(awk '{print $1}' /proc/uptime) / 3600 > 72 ; then
    echo "yes"                                                                                                                                                                        
fi

助けてくれてありがとう!

答え1

完全なテストはAWKで行います。

awk '$1 > (72 * 3600) { print "yes" }' /proc/uptime

これをテストとして使用するには、終了コードを使用します。

if awk '{ exit ($1 < (72 * 3600)) }' /proc/uptime; then
    echo Need to reboot
fi

($1 < (72 * 3600))AWK は、比較が失敗した場合は 0 と評価され、そうでなければ 1 と評価され、終了コードで成功を示すため、条件を反転します。

systemdを使用する場合のもう1つのアプローチは、systemdタイマーを使用することです。OnBootSec=72h(望むよりFelixJNの答え詳細はこちら)。

答え2

systemdタイマーも機能します。

[Unit]
Description=reboot after 72h
 
[Timer]
Unit=systemd-reboot.service
OnBootSec=72h

[Install]
WantedBy=multi-user.target

これはサービスではなくタイマーです。つまり、ファイル名はで終わる必要があります.timer。たとえば、これを/etc/systemd/system/reboot27h.timer有効にして、通常どおりに現在のセッションで開始します。

systemctl enable reboot72h.timer
systemctl start reboot72h.timer

タイマーが正常に機能しているかどうか、次の実行までの残り時間を確認するには、次のようにします。

systemctl list-timers

答え3

スクリプトにifエラーメッセージを表示させる構文エラーがいくつかあります。

  1. この場合、成功時(= true)を返し、失敗時にゼロ以外(= false)を返すifコマンドまたはbash組み込みテスト設定が必要です。0算術比較を実行することを選択したので、それを適切なテスト構成に配置する必要があります。
    if (( variable1 > variable2 )); then .... ; fi
    
  2. uptime浮動小数点数を含むハンドルを使用しています。ただし、Bashは浮動小数点演算を実行できないため、これらの式は期待どおりに機能しません。
  3. テスト構成に条件が含まれていないため、Bashはawkテキスト処理の結果を実行するコマンドとして処理し、現在の稼働時間(エラーメッセージの原因)を「実行」しようとします。

.これを軽減するには、最初をフィールド区切り文字として使用し、秒を整数値に切り捨てます。だから試してみることができます

up=$(awk -F. '{print $1}' /proc/uptime)
if (( up > 72*3600 )); then echo "yes"; else echo "no"; fi

参考にしてください

  • 質問にタグが付けられました。だから、bash固有のテスト構造を使用しました(( ... ))。スクリプトを移植可能にするには、POSIX互換を使用する必要があります。
    if [ $up -gt 259200 ]; then ...; else ...; fi
    
  • 通常、次のようにシェルスクリプトを実行することをお勧めします。shellcheck、構文エラーなどをキャッチするために、多くのLinuxディストリビューションでスタンドアロンプ​​ログラムとしても使用できます。

答え4

#! /bin/bash

if [ $(awk '{print int($1/3600)}' /proc/uptime) -gt 72 ]; then
    echo "yes"
fi

関連情報