cronjob에서 bash 실행

cronjob에서 bash 실행

매분마다 실행되는 cronjob이 있습니다.

*/1 * * * * root sh /test.sh

내 /test.sh는 "top" 및 "free" 명령의 결과를 기록합니다. "sh /teste.sh"를 사용하여 터미널에서 수동으로 실행하고 출력을 멋진 파일에 저장하면 제대로 작동하지만 cron 작업이 실행되면 아래 "free" 명령의 결과만 저장됩니다. 확인해주십시오:

printf "\n" >> "log_lojar_top_free.txt"
printf %s "$(date)" >> "log_lojar_top_free.txt"
printf '\t' >> "log_lojar_top_free.txt"
top -b -n 3 -d 1 | grep "Cpu" |  tail -n 1 | awk '/^%Cpu\(s\)/ {printf $2}' >> "log_lojar_top_free.txt"
printf '\t' >> "log_lojar_top_free.txt"
free | awk '/^Mem:/ {printf $7}' >> "log_lojar_top_free.txt"

마지막(유휴) 줄의 출력만 기록되는 오류는 무엇입니까?

답변1

다른 사람들이 제안한 것처럼 스크립트에서 직접 bash shebang을 사용하거나 bash대신 접두사를 사용해 보십시오 sh. 실제로 어떤 시스템에서 실행되고 있는지 모르기 때문에 최근 /bin/sh -c myscript.sh데비안 파생 버전인 ubuntu에서 스크립트를 호출하는 데 문제가 있었습니다. 를 dash사용하는 버전입니다 bash.

어쩌면 그것이 질문의 핵심일 수도 있습니다.

편집: 이 crontab 항목을 사용하여 루트로 작업했습니다 crontab -e.

*/1 * * * * /bin/bash -c "/test.sh"

답변2

이 버전은 저에게 효과적입니다. 그러나 여기서는 자신의 스크립트를 사용할 수도 있으므로 이것이 문제를 해결할 수 있을지 확신할 수 없습니다.

시스템 전체 crontab 항목( root를 통해 액세스되는 루트 자체 crontab인 경우 이 필드를 생략하십시오 crontab -e):

* * * * * root /root/test.sh

내가 아는 한, 귀하의 스크립트는 세 번째 반복을 수행 top하고 CPU 사용자 모드 비율을 수집합니다. 또한 캐시된 메모리 값도 수집합니다 free. 여기서는 free의 세 번째 반복에서 동일한 값을 포기 하고 추출했습니다 top. 이 스크립트를 /root/test.sh에 복사하고 실행 가능하게 만듭니다.

#!/bin/bash
top -b -n 3 -d 1 |
    awk -v date="$(date)" '
        /^%Cpu/ {cpu=$2}
        /cached Mem/ {cached=$9}
        END {printf "\n%s\t%s\t%s", date, cpu, cached}
    ' >> /root/log_lojar_top_free.txt

스크립트를 실행 가능하게 만듭니다.

chmod +x /root/test.sh

관련 정보