가동 시간이 72시간을 초과하는지 확인하는 방법은 무엇입니까?

가동 시간이 72시간을 초과하는지 확인하는 방법은 무엇입니까?

매일 실행하고, 시스템 가동 시간을 계산하고, 가동 시간이 72시간보다 큰 경우 시스템을 재부팅하는 스크립트(cron 작업)를 생성해야 합니다.

시간 값을 72와 비교할 수 있는 값으로 변환하는 방법을 잃었습니다. 그것은 나를 다시 데려온다6499.04: command not found

#!/bin/bash
if $(awk '{print $1}' /proc/uptime) / 3600 > 72 ; then
    echo "yes"                                                                                                                                                                        
fi

도움을 주셔서 미리 감사드립니다!

답변1

전체 테스트는 AWK에서 수행하겠습니다.

awk '$1 > (72 * 3600) { print "yes" }' /proc/uptime

이것을 테스트로 사용하려면 종료 코드를 사용하십시오.

if awk '{ exit ($1 < (72 * 3600)) }' /proc/uptime; then
    echo Need to reboot
fi

($1 < (72 * 3600))AWK는 비교가 실패하면 0으로 평가되고, 그렇지 않으면 1로 평가되어 종료 코드로 성공을 나타내므로 조건을 반전시킵니다.

systemd를 사용하는 경우 또 다른 접근 방식은 systemd 타이머를 사용하는 것입니다.OnBootSec=72h(바라보다FelixJN의 답변더 알아보기).

답변2

systemd 타이머도 작동합니다.

[Unit]
Description=reboot after 72h
 
[Timer]
Unit=systemd-reboot.service
OnBootSec=72h

[Install]
WantedBy=multi-user.target

이것은 서비스가 아니라 타이머입니다. 즉, 파일 이름은 로 끝나야 합니다 .timer. 예를 들어 이를 /etc/systemd/system/reboot27h.timer활성화하고 평소와 같이 현재 세션에서 시작합니다.

systemctl enable reboot72h.timer
systemctl start reboot72h.timer

타이머가 제대로 작동하는지, 다음 실행까지 남은 시간을 확인하려면 다음을 사용하세요.

systemctl list-timers

답변3

스크립트에 if오류 메시지를 표시하게 하는 구문 오류가 여러 개 있습니다.

  1. 이 경우 성공 시(=true)를 반환하고 실패 시 0이 아닌(=false)을 반환하는 if명령 또는 bash 내장 테스트 구성이 필요합니다 . 0산술 비교를 수행하기로 선택했으므로 이를 적절한 테스트 구성에 배치해야 합니다.
    if (( variable1 > variable2 )); then .... ; fi
    
  2. uptime부동 소수점 숫자가 포함된 핸들을 사용하고 있습니다 . 그러나 Bash는 부동 소수점 연산을 수행할 수 없으므로 이러한 표현식은 예상대로 작동하지 않습니다.
  3. 테스트 구성에 조건을 넣지 않았기 때문에 Bash는 awk텍스트 처리 결과를 실행할 명령으로 처리하여 현재 가동 시간(오류 메시지의 원인)을 "실행"하려고 시도합니다.

.이를 완화하려면 첫 번째를 필드 구분 기호로 사용하여 초를 정수 값으로 자르면 됩니다 . 그래서 시도해 볼 수 있습니다

up=$(awk -F. '{print $1}' /proc/uptime)
if (( up > 72*3600 )); then echo "yes"; else echo "no"; fi

참고하세요

  • 질문에 태그가 지정되었습니다., 그래서 bash 특정 테스트 구조를 사용했습니다 (( ... )). 스크립트를 이식 가능하게 하려면 POSIX 호환을 사용해야 합니다.
    if [ $up -gt 259200 ]; then ...; else ...; fi
    
  • 일반적으로 다음을 통해 쉘 스크립트를 실행하는 것이 좋습니다.shellcheck, 구문 오류 등을 잡기 위해 많은 Linux 배포판에서 독립 실행형 프로그램으로도 사용할 수 있습니다.

답변4

#! /bin/bash

if [ $(awk '{print int($1/3600)}' /proc/uptime) -gt 72 ]; then
    echo "yes"
fi

관련 정보