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

관련 정보