
다음 로깅 스크립트가 있습니다.
#!/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