센서 출력을 개인화하고 파일에 저장

센서 출력을 개인화하고 파일에 저장

터미널 출력을 로그 정보로 다시 포맷하는 방법을 알고 싶습니다. 보다 구체적으로 말하면 패키지 sensors의 명령 출력을 다시 형식화하여 lm-sensors파일에 쓰고 싶습니다 . 출력은 다음과 같습니다.

acpitz-virtual-0
Adapter: Virtual device
temp1:        +61.0°C  (crit = +99.0°C)
temp2:        +29.8°C  (crit = +99.0°C)

coretemp-isa-0000
Adapter: ISA adapter
Physical id 0:  +63.0°C  (high = +86.0°C, crit = +100.0°C)
Core 0:         +62.0°C  (high = +86.0°C, crit = +100.0°C)
Core 1:         +59.0°C  (high = +86.0°C, crit = +100.0°C)
Core 2:         +63.0°C  (high = +86.0°C, crit = +100.0°C)
Core 3:         +61.0°C  (high = +86.0°C, crit = +100.0°C)

radeon-pci-0100
Adapter: PCI adapter
temp1:        +61.5°C

다시 포맷하는 목적은 나중에 gnuplot(라이브 플로팅) 데이터를 사용하는 것입니다. 따라서 결과는 다음과 유사해야 합니다.

# Timestamp [hh:mm:ss]    temp1 [°C]       temp2 [°C]     ... 
13:45:52                  65.0             29.0            .
13:45:53                  66.0             28.0            .
13:45:54                  64.0             27.0            .
13:45:55                  55.0             26.0            .
...                       ...              ...             .

일종의 루프가 필요한 센서 수가 다른 여러 컴퓨터에서 사용하고 싶습니다. 그러나 중복 라인을 제거하는 위치와 방법에 대한 루프가 있습니다(예: acpitz-virtual-0, 어댑터:가상 장치, ...). lm-sensors차트를 생성하는 패키지 기능 도 알고 있습니다 . 하지만 저는 집에서 만든 솔루션을 구현하고 문제를 보다 일반화하고 싶습니다.

답변1

나는 같은 문제가 있었고 해결책을 구현했습니다.

sed파이프라인 출력은 정규식을 사용하여 구문 분석되고 sensors결과는 로그 파일에 추가됩니다.

  1. 날짜는 UNIX 타임스탬프로 파일에 기록되고 표준 출력 형식으로 지정됩니다. 개행을 억제하려면 echo -n "$(date +"%H:%M:%S")이 명령을 사용하십시오.
  2. 다음으로 출력을 sensors파이프하여 sed각 행을 구문 분석하여 검색을 통해 온도를 찾습니다 °C.
  3. 결과는 agine 으로 파이프됩니다 sed. 이제 문자열은 세 부분으로 나뉩니다. 콜론과 공백으로 시작하는 센서 이름 ^[a-zA-Z0-9 ]*:\s*, 기호, 숫자, 점으로 구성된 온도, \([0-9.+-]*\)문자열 끝까지의 나머지 부분입니다 .*$. 두 번째 부분은 괄호를 사용하여 참조로 표시됩니다.
  4. 개행 문자를 제거 하기 위해 결과가 다시 파이프됩니다 sed.자세한 내용을 보려면 클릭하세요.
  5. 스크립트는 X초 동안 휴면 상태입니다. (나의 경우 5초.)

생성된 배치 스크립트:

# Printing the names of the columns as first row in file
echo "Time;     temp1;  temp2;  Physical id 0;  Core 0; Core 1; Core 2; Core 3; SIO Temp;       temp3" > Temperatures.log
while true
do
    # Printing the time and all temperatures to stdout
    echo -n "$(date +"%H:%M:%S"): "
    sensors | sed -n "/°C/p" | sed "s/^[a-zA-Z0-9 ]*:\s*\([0-9.+-]*\).*$/\1/" | sed ':a;N;$!ba;s/\n/;\t/g'

    # Logging time as UNIX time and temperatures to file
    echo -n "$(date +"%s");     " >> Temperatures.log
    sensors | sed -n "/°C/p" | sed "s/^[a-zA-Z0-9 ]*:\s*\([0-9.+-]*\).*$/\1/" | sed ':a;N;$!ba;s/\n/;\t/g' >> Temperatures.log

    # Sleeping for X seconds
    sleep 5
done

관련 정보