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