cron으로 실행하면 top의 출력이 80개 열로 잘립니다.

cron으로 실행하면 top의 출력이 80개 열로 잘립니다.

다음 로깅 스크립트가 있습니다.

#!/bin/bash
top -b -c -n 1 >> /var/log/toplog/top.log

내 crontab에는 다음과 같은 기록이 있습니다.

*/1 * * * *     /home/clime/scripts/toplog.sh

문제는 top.log의 행이 80자로 잘린다는 것입니다. 예:

 1512 root      20   0 80756 1436  572 S  0.0  0.1   0:05.92 /usr/libexec/postfi

콘솔에서 직접 명령을 실행하면 이런 일이 발생하지 않습니다.

COLUMNS 변수를 사용하려고 했습니다.

*/1 * * * *     COLUMNS=999 /home/clime/scripts/toplog.sh

그러나 이로 인해 모든 줄은 정확히 999자 길이가 됩니다. 사용되지 않은 공간은 공백으로 채워지는데, 이는 제가 원하는 것이 아닙니다.

이 이상한 문제를 해결하는 방법은 무엇입니까? 내 시스템은 centos 6.3입니다.

답변1

top항상 마지막 화면 열까지 공백을 표시합니다. 후행 공백이 있는 줄과 후행 공백이 없는 줄을 시각적으로 구별할 수 없기 때문에 터미널에 인쇄할 때 이를 인식하지 못합니다. 마우스로 복사하여 붙여넣거나 에서 공백을 발견할 수 있습니다 screen.

공백을 제거하려면 공백을 필터링하면 됩니다.

COLUMNS=9999 top -b -c -n 1 | sed 's/  *$//' >>/var/log/toplog/top.log

당신이 무엇을 위해 달리고 있든 top아마도 훨씬 더 나은 것이 있을 것입니다.모니터링사용 가능한 도구.

답변2

비슷한 문제가있었습니다. Bash 스크립트는 명령줄에서 잘 작동했지만 cron에서 실행할 때 'top' 출력이 80자로 잘렸습니다.

먼저 COLUMNS 환경 변수를 설정하여 여기에서 허용되는 솔루션을 시도했습니다. 이 작업을 수행할 수 없습니다(SLES 12.1). 심지어 파일 쓰기, 내보내기, 소스 사용자 정의 프로필을 시도했습니다.

효과가 있었던 것은 top의 -w 옵션을 사용하는 것이었습니다.
알림 및 종료 안전 관련 항목을 제외한 내 스크립트의 내용은 다음과 같습니다.

#!/usr/bin/sh

PROC_FOUND=""
MAX_CPU=0

RETVAL="$(top -bc -n 1 -w 512 | tail -n+8 | awk -v cpulimit=$MAX_CPU '{if ($9>=cpulimit) print $1 " " $9 " " $12; }')"

IFS='
'
set -f
for line in ${RETVAL}; do
{
        echo "found [$line]" > /dev/tty

        IFS=', '
        read -r -a array <<< "$line"
        #echo "array is ... ${array[*]}"
        PID_VAL=${array[0]}
        CPU_VAL=${array[1]}
        PROC_FOUND=${array[2]}

        echo "Monitored a High CPU for process [${PROC_FOUND} ${PID_VAL}] on "${HOSTNAME}" where ${CPU_VAL}% >= ${MAX_CPU}%."
}
done
set +f
unset IFS
exit

관련 정보