回答:
少なくともUbuntuシステムには、次を含む/etc/apt/apt.conf.d/15update-stampファイルがあります。
APT::Update::Post-Invoke-Success {"touch /var/lib/apt/periodic/update-success-stamp 2>/dev/null || true";};
/ var / lib / apt / periodic / update-success-stampがあるかどうかを確認し、もしあれば、使用できます
stat -c %y /var/lib/apt/periodic/update-success-stamp
最後の「apt-get update」呼び出しの時刻を取得するコマンド。
また、システムにそのapt設定ファイルがない場合は、いつでも追加できます。
apt-get updateを実行すると更新される/ var / lib / apt / lists内のファイルのアクセス時間を確認できます。apt-get updateがsudoで実行された場合、完了時に/var/log/auth.logにログが記録されているはずです。
apt-get update
ファイルを作成または更新することはできません。キャッシュディレクトリを更新するため、これを使用して最後のapt-get update
実行時のタイムスタンプを取得できます。
stat -c %Y /var/cache/apt/
apt-get update
ロックファイルから移動しないでください。ロックファイルは信頼性が高くありません。新しいLinuxリリースでは時間が経つにつれて移動する傾向があり、多くのプログラムは、ロックファイルの処理が完了するとロックファイルをクリーンアップ(削除)します。
次のコマンドは、探しているものを取得します。
ls -lt --time-style="long-iso" /var/log/apt | grep -o '\([0-9]\{2,4\}[- ]\)\{3\}[0-9]\{2\}:[0-9]\{2\}' -m 1
これは1つの2つのコマンドです。最初のコマンドの結果は、パイプ(|)記号を介して2番目にフィルター処理されます。
最初のコマンドでは、「ls」を使用して/ var / log / aptディレクトリのファイルの内容をリストしています。これは、apt-getのアクセス履歴ログを保存するディレクトリです。「-lt」部分は、実際には2つのスイッチです。最初の「l」スイッチは、「ls」に対して、行ごとに1つのファイルを詳細にリストするように指示します。2番目の「t」スイッチは、「ls」に日付と時刻でソートするように指示します。「--time-style」は、日時を「YYYY-MM-DD HH:MM」の形式で強制的に表示します。
コマンドの「grep」部分の「-o」スイッチは、正規表現に正確に一致する各行の部分のみを表示するようにgrepに指示します。ここで使用した正規表現は、「ls」コマンドで指定された形式の日付時刻を検出します。また、「grep」コマンドの最後に、「-m」スイッチがあり、その直後に数字の「1」が付いていることがわかります。これは、「grep」に最初の一致を見つけた後に一致の検索を停止するように指示します。
つまり、要約すると、aptログファイルの詳細を一覧表示して、最終変更日を確認できるようにします。次に、日付で並べ替え、grepに最初の日付を先頭から取得するように指示します。これが、apt-getが実行された最後の日付です。
しかし、しばらくの間、悪魔の支持者を演じるために、UbuntuのようなDebianプラットフォームでは、apt-getを定期的に実行されるジョブとしてスケジュールするのが一般的です。apt-get実行のもう一方の端にいる人を探している場合、実際にマシンを見つけることができます。アクセスログとaptログを常に一致させて、タイムスタンプが一致するかどうかを確認できます。ユーザーのコマンド履歴をある程度見ることも可能です。
お役に立てれば!
/var/log/apt
、たとえば、私が実行したときにも記録されますapt-get install some-package
。実際にはUbuntuの上ではないではない私が行うときに何かをログapt-get update
$ ls -l /var/lib/dpkg/lock
-rw-r----- 1 root root 0 2011-11-16 09:40 /var/lib/dpkg/lock
私は/var/cache/apt
実行する必要があるかどうかを判断するために使用しますapt-get update
。デフォルトでは、現在の時間とキャッシュ時間の差/var/cache/apt
が24時間未満であれば、実行する必要はありませんapt-get update
。デフォルトの更新間隔は、関数に数値を渡すことでオーバーライドできますrunAptGetUpdate()
function getLastAptGetUpdate()
{
local aptDate="$(stat -c %Y '/var/cache/apt')"
local nowDate="$(date +'%s')"
echo $((nowDate - aptDate))
}
function runAptGetUpdate()
{
local updateInterval="${1}"
local lastAptGetUpdate="$(getLastAptGetUpdate)"
if [[ "$(isEmptyString "${updateInterval}")" = 'true' ]]
then
# Default To 24 hours
updateInterval="$((24 * 60 * 60))"
fi
if [[ "${lastAptGetUpdate}" -gt "${updateInterval}" ]]
then
info "apt-get update"
apt-get update -m
else
local lastUpdate="$(date -u -d @"${lastAptGetUpdate}" +'%-Hh %-Mm %-Ss')"
info "\nSkip apt-get update because its last run was '${lastUpdate}' ago"
fi
}
サンプル出力:
<root@ubuntu><~/ubuntu-cookbooks/libraries>
# runAptGetUpdate
Skip apt-get update because its last run was '0h 37m 43s' ago
個人のgithubからこれらの関数を抽出しました:https : //github.com/gdbtek/ubuntu-cookbooks/blob/master/libraries/util.bash
info
とisEmptyString
?また、info
それはコマンドでもあるため、関数名の選択は不適切です。それ以外は、素晴らしい解決策です!
更新が最終日に実行されていない場合に実行する簡単なワンライナーを次に示します。
(find /var/lib/apt/periodic/update-success-stamp -mtime +1 | grep update-success-stamp) && (/usr/bin/apt-get update)
1日以上前に変更されたupdate-success-stampファイルを探します。適切な年齢のファイルを見つけると、更新を実行します。注:これが機能するには、update-success-stampファイルが存在する必要があります。
/var/lib/apt/periodic/update-stamp