cron 작업에서 다음 줄을 설정했습니다./etc/cron.d/find_old_file
* * * * * root [[ -d /var/log/ambari-metrics-collector ]] && find /var/log/ambari-metrics-collector -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '%TY %Tb %Td %TH:%TM %P\n' >> /var/log/find_old_file
이 크론은 10일 전의 로그를 찾아야 합니다(단, /var/log/ambari-metrics-collector
폴더가 존재하는 경우에만 해당).
불분명한 이유로 우리 /var/log/find_old_file
는
테스트했을 때 이 줄은 shell bash에서는 잘 작동했지만 cron에서는 작동하지 않았습니다.
우리는 또한 추가합니다2>&1파일 끝에 있지만 작동하지 않습니다
내 크론 작업에 어떤 문제가 있는지 알려주세요.
more /etc/cron.d/find_old_file
* * * * * root [[ -d /var/log/ambari-metrics-collector ]] && find /var/log/ambari-metrics-collector -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '%TY %Tb %Td %TH:%TM %P\n' >> /var/log/find_old_file 2>&1
예를 들어 쉘 bash에서 테스트할 때
[[ -d /var/log/ambari-metrics-collector ]] && find /var/log/ambari-metrics-collector -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '%TY %Tb %Td %TH:%TM %P\n'
2018 Aug 13 12:54 collector-gc.log-201808130951
2018 Aug 13 04:22 collector-gc.log-201808130403
2018 Aug 01 12:40 gc.log-201808011229
2018 Aug 01 12:40 collector-gc.log-201808011229
2018 Aug 09 15:36 gc.log-201808091332
2018 Aug 09 10:50 gc.log-201808090825
2018 Aug 13 04:02 collector-gc.log-201808130346
2018 Aug 13 16:51 gc.log-201808131358
2018 Aug 01 13:35 gc.log-201808011241
2018 Aug 01 13:35 collector-gc.log-201808011241
2018 Aug 09 15:39 collector-gc.log-201808091332
2018 Aug 02 23:06 gc.log-201808022256
내가 이것을 넣었을 때
* * * * * root echo test >> /var/log/test
그러면 작동하지만 제가 설명한 경로는 아닙니다
그럼 여기서 무슨 일이 일어나고 있는 걸까요?
답변1
%
crontab의 플래그남자 (5) crontab 참조특별한 의미(개행 문자)가 있는 경우 명령이 제대로 작동하려면 해당 문자를 이스케이프 처리해야 합니다.
A "%" character in the
command, unless escaped with a backslash (\), will be changed into
newline characters, and all data after the first % will be sent to
the command as standard input.
따라서 명령은 다음과 같아야 합니다.
* * * * * root [[ -d /var/log/ambari-metrics-collector ]] && find /var/log/ambari-metrics-collector -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '\%TY \%Tb \%Td \%TH:\%TM \%P\n' >> /var/log/find_old_file
답변2
실행 가능한 쉘 파일 생성
cat /root/bin/find_old_file
#!/bin/sh
[[ -d /var/log/ambari-metrics-collector ]] && find /var/log/ambari-metrics-collector -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '%TY %Tb %Td %TH:%TM %P\n' >> /var/log/find_old_file
cron을 통해 실행합니다.
cat /etc/cron.d/find_old_file
* * * * * root /root/bin/find_old_file
cron에 맞게 스크립트의 형식을 다시 지정해야 하는 경우 cron에서 스크립트를 옮기는 것이 유용한 경우가 많습니다.