저는 집에서 작은 Linux 서버를 실행하고 있으며 5초마다 CPU 코어의 온도를 기록하는 스크립트를 작성하고 있지만 이것이 작동하려면 타임스탬프가 필요합니다. 지금까지는 sensors
명령의 출력을 파일에 저장하는 기능 과 날짜와 시간을 인쇄하는 명령이 있습니다.이 둘을 결합하는 방법을 알아내면 됩니다.
sensors | grep ^Core* >> temps.log
다음 형식으로 temps.log에 임시 값을 저장합니다.
Core 0: +39.0°C (high = +76.0°C, crit = +100.0°C)
Core 1: +40.0°C (high = +76.0°C, crit = +100.0°C)
date +%m/%d/%y-%H:%M:%S
그리고 돌아올 날짜는 제가 할 수 있어요
mm/dd/yy-hh:mm:ss
구글링을 해보니 누군가가 사용을 제안하는 것을 보았지만 작업 gawk
방법을 전혀 모릅니다 gawk
.
답변1
5초마다 [...] 로그하는 스크립트 [...] 타임스탬프가 필요합니다 [...] 파일이 특정 크기에 도달하면 루프 [...]
기본 프로그램의 로그 출력을 입력으로 가져와 크기가 제한된 로그 파일에 기록하고 타임스탬프를 추가하는 도구가 필요합니다. 기존 도구는 이 작업과 그 이상을 수행할 수 있습니다. 그들이 하는 "추가" 작업은 요청 시 트리거될 수 있는 로그 파일의 자동 회전으로 크기 제한을 유지합니다.로그 디렉터리현재 및 이전 로그 파일.
다음 도구 중에서 선택할 수 있습니다.
- 댄 번스타인의
multilog
데몬 도구에서 - 브루스 건터의
multilog
daemontools-encore에서 - 로랑 베르코
s6-log
s6부터 - 게릿 펩의
svlogd
루넷에서 - 웨인 마샬의
tinylog
범죄자로부터 - 내 거
cyclog
어릴때부터 간식
장기 실행 유틸리티가 다음과 같이 몇 초마다 원하는 로그 출력을 인쇄한다고 가정해 보겠습니다.
#!/bin/sh # 모니터링 센서 2>&1을 실행 사실이긴 하지만 하다 감지기 수면 5 완료 | grep --line-buffered -- '^Core'
사용법은 매우 간단합니다.
monitor-sensors | cyclog ./temps
monitor-sensors | multilog t ./temps
그리고 쉽게 조정할 수 있습니다:
monitor-sensors | cyclog --max-file-size 32768 --max-total-size 1048576 ./temps
monitor-sensors | s6-log t s32768 S1048576 ./temps
monitor-sensors | multilog t s32768 n5 ./temps
여기에서 daemontools-encore/runit/perp/s6/nosh와 같은 도구 세트를 사용하여 해당 파이프의 왼쪽과 오른쪽을 run
프로그램으로 이동하고 링크 쌍에 대한 실제 데몬으로 만드는 것은 작은 단계입니다. 프로세스가 실행됩니다. .
그러나 예를 들어 명령줄에서 일회성 호출만 수행하려는 경우 두 가지 모두 기존 로그 디렉터리에 대한 일회성 출력 사례를 처리할 수도 있습니다.
이러한 도구 중 일부는 다른 형태의 타임스탬프를 수행할 수 있지만 모두 TAI64N 타임스탬프를 수행할 수 있습니다. TAI64N 타임스탬프는 나노초 정밀도를 제공하도록 설계되었지만 위의 방법 중 일부는 이를 달성하지 못했습니다. 윤초와 같은 작업은 TZ 데이터베이스가 알고 있는 한 훌륭하게 처리할 수 sort
있습니다 sort -m
.
TZ
다음 도구를 사용하여 TAI64N 타임스탬프를 현재 시간대의 현지 시간으로 변환합니다(또는 단지 환경 변수라고 생각하면 선택한 시간대).
- 댄 번스타인의
tai64nlocal
데몬 도구에서 - 브루스 건터의
tai64nlocal
daemontools-encore에서 - 내 거
tai64nlocal
어릴때부터 간식
다음과 같은 로그를 사용하여 작성되므로 다음과 같은 로그를 관찰하세요.
tail -F
, 그러나tail
매우 빠르게 회전할 때 알려진 문제가 있습니다. (이것이 입니다tail
.logrotate
파일이 완전히 작성되면 이러한 추가 문제가 발생할 위험은 없습니다tail
.)- 내 거
follow-log-directories
nosh에서 나온 이 로그 디렉터리는 이러한 종류의 로그 디렉터리를 "인식"하고 "커서"(디스크에 영구적으로 저장됨)를 사용하여 로그 디렉터리의 위치를 안정적으로 추적하여 로그 추적기가 알아차리지 못한 채 여러 회전이 발생하는 경우 계속 진행합니다. .
다음 도구를 사용하여 다른 유형의 처리를 수행할 수 있습니다.
- 러스 앨버리
multilog-watch
logrange
- 폴 크레이머의
multilog-stamptail
- 내 거
export-to-rsyslog
어릴때부터 간식
추가 읽기
- 조나단 데보인 폴라드(2015). "기록".데몬 도구 계열. 자주 주어지는 답변입니다.
- 캔트렐, 브라이언(2013). 크루즈가 어떻게 오디세이가 되는지. OmniIT 급증 2013. 유튜브.
- 브라이언 캔트렐(2012-07-29).tail -f wrt 잘림 동작 illusmos - 개발자.
- https://unix.stackexchange.com/a/294206/5132
답변2
@JdeBP는 당신이 해야 할 일에 대해 이미 답변했습니다. 하지만 그것은 당신이 묻는 질문이 아닙니다. 따라서 Google에서 여기로 와서 여러 줄 출력에 콘텐츠를 추가/추가하는 방법을 찾으려는 사람은 다음과 같습니다.
첫째, ^Core*
당신이 생각하는 대로 작동하지 않을 수도 있습니다. 이는 "Cor"로 시작하고 그 뒤에 "e"가 여러 개 오는("Cor", "Core", "Coreeeee" 등) 줄을 일치시키는 정규식입니다.
둘째, xargs
특히 한 줄짜리 스크립트와 빠른 스크립트를 위한 훌륭한 도구입니다. xargs
각 입력 줄에 대해 작업을 수행하고 매개 변수를 사용하여 각 줄에 대해 명령을 실행해야 할 수도 있습니다 -I
. 따라서 다음과 같이 쉽게 할 수 있습니다.
sensors | grep '^Core*' | xargs -I{} echo "${stamp}: {}" >> temps.log
'^Core*'
예상치 못한(가능성은 거의 없지만) 쉘 확장을 원하지 않기 때문에 따옴표가 포함 되었습니다. in은 {}
각 입력 줄을 실행할 명령의 인수로 바꾸라고 지시합니다. 물론 다른 패턴을 선택할 수도 있습니다. 저는 모방의 구문을 좋아합니다. 에 날짜/시간을 저장한다고 가정합니다.-I
xargs
{}
find -exec
${stamp}
stamp
또한 서브셸을 시작하고 date
그 안에서 명령을 실행하고(원하는 형식 지정) xargs
표준 출력을 인수의 일부로 사용할 수도 있습니다 echo
.
sensors | grep '^Core*' | xargs -I{} echo "$(date): {}" >> temps.log
다시 말하지만, 어떻게 해야 합니까?아마도해야 할 일은 로깅을 위해 테스트되고 유지 관리되는 도구를 사용하는 것입니다. 하지만 난 여기서 대답하고 있어grep 출력에 타임스탬프를 추가/추가하는 방법, 로그를 올바르게 만드는 방법보다는.
답변3
내가 올바르게 이해했다면, 당신이 원하는 것은 grep 출력의 각 줄 앞에 현재 날짜를 추가하는 것입니다. 이것은 bash 스크립트에 대한 간단한 작업입니다.
sensors | grep ^Core |\
(
DATE=$(date +%m/%d/%y-%H:%M:%S)
while read LINE
do
echo "$DATE $LINE"
done
) >> temps.log
답변4
sensors | grep ^Core* | xargs -d '\n' -I%% sh -c 'echo $(date +%H:%M:%S) $0' %% > temps.log