Tôi đã sử dụng, thay vì mv, cplệnh để đạt được nó rằng bạn có thể có một số logfile ngay tại nơi Phần mềm đang chạy. Có thể trong thư mục nhà người dùng khác hoặc trong thư mục ứng dụng và có tất cả các bản ghi ở một nơi dưới dạng liên kết cứng. Nếu bạn sử dụngmv lệnh, bạn sẽ mất liên kết cứng. Nếu bạn sử dụng cplệnh thay vì bạn sẽ giữ liên kết cứng này.
mã của tôi là một cái gì đó như:
TMP_FILE="$(mktemp "${TMPFILENAME}.XXX")"
for FILE in "${LOGFILE_DIR}"/* ; do
tail -n $MAXLINES "${FILE}" > "${TMP_FILE}"
if [ $(ls -g "${TMP_FILE}" | awk '{print $4}') -lt $(ls -g "${FILE}" | awk '{print $4}') ] ; then
cp "${TMP_FILE}" "${FILE}"
fi
done
Vì vậy, nếu các tệp nằm trên cùng một Hệ thống tệp, bạn cũng có thể cung cấp một số quyền khác nhau cho người dùng và trong ${LOGFILE_DIR} bạn sửa đổi độ dài như tôi.
Nếu nó là mv lệnh bạn mất liên kết cứng giữa các tệp và do đó tệp thứ hai của bạn không được kết nối nhiều hơn với tệp đầu tiên - có thể được đặt ở một số nơi khác.
Nếu ở nơi khác, bạn không cho phép ai đó xóa tệp thì nhật ký của bạn sẽ ở cùng nhau và được kiểm soát tốt thông qua tập lệnh của riêng bạn.
logrotatecó lẽ đẹp hơn Nhưng tôi hài lòng với giải pháp này.
Đừng bị làm phiền bởi "" nhưng trong trường hợp của tôi, có một số tệp có dấu cách và các chữ cái đặc biệt khác và nếu tôi không thực hiện "" xung quanh hoặc {} thì toàn bộ lô không hoạt động tốt.
Ví dụ: có một Dir nơi các tệp cũ hơn được tự động nén vào một OLDFILE.zipvà mọi thứ được nén cũng được liệt kê trong Tệp, .zip_logvì vậy .zip_logcũng có trong Dir này nhưng trong LOGFILE_DIRTôi đã có:
ln .zip_log "${LOGFILE_DIR}/USER_ZIP_log"
các tập tin bằng nhau vì nó là một liên kết cứng.
logrotatelà giải pháp tao nhã