매일 실행하고, 시스템 가동 시간을 계산하고, 가동 시간이 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
오류 메시지를 표시하게 하는 구문 오류가 여러 개 있습니다.
- 이 경우 성공 시(=true)를 반환하고 실패 시 0이 아닌(=false)을 반환하는
if
명령 또는 bash 내장 테스트 구성이 필요합니다 .0
산술 비교를 수행하기로 선택했으므로 이를 적절한 테스트 구성에 배치해야 합니다.if (( variable1 > variable2 )); then .... ; fi
uptime
부동 소수점 숫자가 포함된 핸들을 사용하고 있습니다 . 그러나 Bash는 부동 소수점 연산을 수행할 수 없으므로 이러한 표현식은 예상대로 작동하지 않습니다.- 테스트 구성에 조건을 넣지 않았기 때문에 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