Hỏi về crontab trên Centos 6.5

Mình có 1 đoạn script như này đặt trên server để xóa log hệ thống

#/bin/bash
### Get numberdays backup
# DIR_LOG=/u01/bankplus/log/lo
g #thu muc chua log
a=`ls -lht --time-style long-iso | more | tail -1 | awk -F ' ' '{print $6}'` # lay ngay cuoi cung cua log
echo $a
lastday=$(date -d "20180801" '+%s') # chuyen dinh dang time de tinh so ngay
daynow=`date +%Y%m%d` # lay ngay hien tai
echo $daynow
day=$(date -d "$daynow" '+%s') # chuyen dinh dang time de tinh so ngay
numberdays=$(( ( day - lastday )/(60*60*24) )) #tinh so ngay chua log da tao
echo $numberdays

### backup file & zip file
for i in `seq 1 $numberdays`
do
daybackup=`date +%Y-%m-%d --date="$i days ago"`
if ls | grep $daybackup;then
mkdir $daybackup && mv mobileKenh.log.$daybackup* $daybackup && zip -r mobileKenh.log.$daybackup.zip $daybackup && mv mobileKenh.log.$daybackup.zip /u01/app/tomcat_app_kpp/log_bk && rm -rf $daybackup
fi
done

Vấn đề mình đang gặp phải là script này chạy bằng tay thì đúng, chuẩn không cần chỉnh nhưng khi chuyển sang chạy bằng crontab thì nó không chạy được, nhờ mọi người xem giúp mình với

set permision cho cái cái tài khoản chạy crontab chưa?

Rồi bạn, nó chạy dc vào crontab rồi, nhưng mà nó ko chạy dc vào các lệnh của mình, mình đã thử xóa hết lệnh đi để mỗi lệnh tạo file thì vẫn ăn

Chạy job bằng root.Đoạn cuối thì chown và chmod cái file backup qua cái tài khoản thường :slight_smile:

Vấn đề là mình sợ nó còn chưa chạy đến cái đoạn ấy cơ

Hi Duy Nguyen Duc.
Theo mình vấn đề là đường dẫn. Bạn thử copy file kịch bản ra một thu mục khác và chạy xem.
P/S Mình thường đê đường dẫn tuyệt đối cho mấy file kịch bản kiểu này.

Mình thấy nó vẫn chạy vào file sh nhưng không chạy dc các lệnh trong ấy :frowning:

crontab không load biến môi trường đặt trong .bash_profile hoặc .bashrc
Vì thế khi chạy nó thường lỗi, ví dụ như mấy cái lệnh ls thì nó trả về là k có command. Thường khi viết script chạy với crontab, để tránh mấy cụ củ chuối này thì người ta thường dùng 2 cách:

  • Cách 1: cho load .bash_profile trước rồi mới chạy script: sử dụng lệnh source /root/.bash_profile sau đó làm gì thì làm
  • Cách 2: sử dụng đường dẫn tuyệt đối cho các file thực thi: ví dụ nếu cần sử dụng các hàm date, ls thì bổ sung thành đường dẫn tuyệt đối --> /usr/bin/ls, /usr/bin/date
    kiểu thế.
1 Like

Hi bạn, mình định xử lý như này, mình sẽ đặt trong file sh 1 lệnh VD:
./filechay.sh để cho chỉ chạy crontab cho nó chạy vào file này thôi. Không biết xử lý như này có giải quyết được vấn đề không nhỉ?

ko giải quyết được gì đâu. bác cứ nhét vào thử. đợi tới giờ nó chạy rồi vào xem /var/spool/mail/root xem crontab báo gì rồi debug. vài lượt thế là OK ấy mà

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?