답변:
적어도 우분투 시스템에는 다음을 포함하는 /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-get update를 실행할 때 업데이트되는 / var / lib / apt / lists의 파일에서 액세스 시간을 확인할 수 있습니다. sudo를 사용하여 apt-get 업데이트를 실행 한 경우 /var/log/auth.log에 행이 기록되어 있어야합니다.
잠금 파일에서 벗어나지 마십시오. 잠금 파일은 신뢰할 수 없으며 새로운 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
이것은 하나의 두 가지 명령입니다. 첫 번째 명령의 결과는 파이프 (|) 기호를 통해 두 번째 명령으로 필터링됩니다.
첫 번째 명령에서는 "ls"를 사용하여 apt-get에 대한 액세스 기록 로그를 저장하는 디렉토리 인 / var / log / apt 디렉토리의 파일 내용을 나열합니다. "-lt"부분은 실제로 두 개의 스위치입니다. 첫 번째 "l"스위치는 "ls"에게 한 줄에 하나의 파일을 자세하게 나열하도록 지시합니다. 두 번째 "t"스위치는 "ls"에게 날짜 및 시간을 기준으로 정렬하도록 지시합니다. "--time-style"은 날짜 시간이 "YYYY-MM-DD HH : MM"형식으로 표시되도록합니다.
명령의 "grep"부분에서 "-o"스위치는 grep에게 각 행에서 정규식과 정확히 일치하는 부분 만 표시하도록 지시합니다. 여기서 사용한 정규식은 "ls"명령에 지정된 형식의 날짜 시간을 감지합니다. 또한 "grep"명령의 마지막 부분에 숫자 "1"이있는 "-m"스위치가 바로 뒤에 있다는 사실에 주목할 것입니다. 이것은 "grep"에게 첫 번째를 찾은 후 일치하는 것을 찾지 말라고 지시합니다.
요약하자면, 우리는 마지막으로 수정 된 날짜를 볼 수 있도록 apt 로그 파일 세부 정보를 나열한 다음 날짜별로 정렬하고 grep에게 첫 번째 날짜를 맨 위로 가져 오도록 지시합니다. 그것이 apt-get이 마지막으로 실행 된 날짜입니다.
그러나 악마의 옹호자를 잠시 연기하기 위해 우분투와 같은 데비안 플랫폼은 apt-get을 정기적으로 실행되는 작업으로 예약하는 것이 일반적입니다. apt-get 실행의 다른 쪽 끝에서 사람을 찾고 있다면 실제로 기계를 찾을 수 있습니다. 액세스 스탬프를 apt 로그와 일치시켜 타임 스탬프가 일치하는지 확인할 수 있습니다. 또한 사용자의 명령 기록을 어느 정도 볼 수 있습니다.
이것이 도움이되기를 바랍니다!
/var/log/apt
내가 예에 대한 작업을 수행 할 때 또한 기록됩니다 apt-get install some-package
. 실제로 우분투에서는 내가 할 때 무언가를 기록 하지 않습니다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)
하루 이상 전에 수정 된 update-success-stamp 파일을 찾습니다. 적절한 나이의 파일을 찾으면 업데이트를 실행합니다. 참고 :이 작업을 수행하려면 update-success-stamp 파일이 있어야합니다.
/var/lib/apt/periodic/update-stamp