毎日実行し、システムの稼働時間を計算し、稼働時間が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
エラーメッセージを表示させる構文エラーがいくつかあります。
- この場合、成功時(= true)を返し、失敗時にゼロ以外(= false)を返す
if
コマンドまたはbash組み込みテスト設定が必要です。0
算術比較を実行することを選択したので、それを適切なテスト構成に配置する必要があります。if (( variable1 > variable2 )); then .... ; fi
uptime
浮動小数点数を含むハンドルを使用しています。ただし、Bashは浮動小数点演算を実行できないため、これらの式は期待どおりに機能しません。- テスト構成に条件が含まれていないため、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