추가 읽기

추가 읽기

저는 집에서 작은 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데몬 도구에서
  • 브루스 건터의multilogdaemontools-encore에서
  • 로랑 베르코s6-logs6부터
  • 게릿 펩의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 타임스탬프를 현재 시간대의 현지 시간으로 변환합니다(또는 단지 환경 ​​변수라고 생각하면 선택한 시간대).

다음과 같은 로그를 사용하여 작성되므로 다음과 같은 로그를 관찰하세요.

  • tail -F, 그러나 tail매우 빠르게 회전할 때 알려진 문제가 있습니다. (이것이 입니다 tail. logrotate파일이 완전히 작성되면 이러한 추가 문제가 발생할 위험은 없습니다 tail.)
  • 내 거follow-log-directoriesnosh에서 나온 이 로그 디렉터리는 이러한 종류의 로그 디렉터리를 "인식"하고 "커서"(디스크에 영구적으로 저장됨)를 사용하여 로그 디렉터리의 위치를 ​​안정적으로 추적하여 로그 추적기가 알아차리지 못한 채 여러 회전이 발생하는 경우 계속 진행합니다. .

다음 도구를 사용하여 다른 유형의 처리를 수행할 수 있습니다.

추가 읽기

답변2

@JdeBP는 당신이 해야 할 일에 대해 이미 답변했습니다. 하지만 그것은 당신이 묻는 질문이 아닙니다. 따라서 Google에서 여기로 와서 여러 줄 출력에 콘텐츠를 추가/추가하는 방법을 찾으려는 사람은 다음과 같습니다.

첫째, ^Core*당신이 생각하는 대로 작동하지 않을 수도 있습니다. 이는 "Cor"로 시작하고 그 뒤에 "e"가 여러 개 오는("Cor", "Core", "Coreeeee" 등) 줄을 일치시키는 정규식입니다.

둘째, xargs특히 한 줄짜리 스크립트와 빠른 스크립트를 위한 훌륭한 도구입니다. xargs각 입력 줄에 대해 작업을 수행하고 매개 변수를 사용하여 각 줄에 대해 명령을 실행해야 할 수도 있습니다 -I. 따라서 다음과 같이 쉽게 할 수 있습니다.

sensors | grep '^Core*' | xargs -I{} echo "${stamp}: {}" >> temps.log

'^Core*'예상치 못한(가능성은 거의 없지만) 쉘 확장을 원하지 않기 때문에 따옴표가 포함 되었습니다. in은 {}각 입력 줄을 실행할 명령의 인수로 바꾸라고 지시합니다. 물론 다른 패턴을 선택할 수도 있습니다. 저는 모방의 구문을 좋아합니다. 에 날짜/시간을 저장한다고 가정합니다.-Ixargs{}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

관련 정보