crontab이 작동하지 않거나 스크립트 오류가 있습니까?

crontab이 작동하지 않거나 스크립트 오류가 있습니까?

작동하지 않는 cronjob이 붙어 있습니다. 하루 방치했다가 새로운 아이디어로 다시 해결해 보았으나 여전히 운이 좋지 않았습니다.

나는 이 중대한 질문에 대한 답을 찾으려고 노력하고 있습니다.우편 엽서, 그러나 모든 것이 나에게 명확하지는 않았으며 결국에는 여전히 작동하지 않았습니다. 설상가상으로 /var/log에는 로그가 없고 cron에 대한 오류도 없습니다.

나는 무엇을 성취하려고 하는가?
웹캠으로 채워진 디렉토리를 자동으로 삭제합니다. 디렉토리에는 스냅샷이 있습니다. 목록의 모습입니다.

pi@raspberrypi:/media/pi/USB/Dahua/Dahua $ ll
total 24K
drwxr-xr-x 3 xxxxxxxx xxxxxxxxx 4.0K Sep  2 05:59 2018-09-02d
drwxr-xr-x 3 xxxxxxxx xxxxxxxxx 4.0K Sep  3 00:57 2018-09-03d
drwxr-xr-x 3 xxxxxxxx xxxxxxxxx 4.0K Sep  4 02:03 2018-09-04d
drwxr-xr-x 3 xxxxxxxx xxxxxxxxx 4.0K Sep  5 01:20 2018-09-05d
drwxr-xr-x 3 xxxxxxxx xxxxxxxxx 4.0K Sep  6 00:20 2018-09-06
-rw-r--r-- 1 xxxxxxxx xxxxxxxxx 4.0K Sep  6 22:28 DVRWorkDirectory

x개의 최신 파일을 유지하고 나머지 파일을 삭제하고 싶습니다. 이 모든 것은 매주 또는 매일 특정 시간에 실행될 수 있는 cronjob을 통해 달성됩니다.

어려워 보이지는 않지만 실행에 옮길 수는 없습니다. 실제로 내 Linux 지식은 매우 기본적이며 이것이 내 문제의 원인일 수 있습니다.


1단계: 내 스크립트, 권한 및 파일 위치.

내 연구에서 나는 이 세 가지 주제가 매우 중요하다는 것을 알았습니다. 그러므로 이것은 귀중한 정보가 될 것입니다.

-rwxr--r-- 1 root staff 183 Sep  6 15:22 dahuapurge.sh

/usr/local/bin

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
#
#
#Keep the Dahua pics for max x time.
cd /media/pi/USB/Dahua/Dahua/
sudo rm -rf `ls -tl | tail -n +8`

2단계: 내 cronjob 구성.

cronjob을 생성하기 위해 crontab -e 명령을 사용했습니다. 파일에는 내가 직접 작성한 규칙을 제외한 모든 줄에 주석이 달렸습니다. 알아요. 지금은 매시간 실행되도록 설정해 뒀어요.

# AUTHOR: - xxxx xxxx
# DATE:   - 31/08/2018
# DESCR:  - Purge Cam pics
# LINK: -
#
0 * * * * /usr/local/bin/dahuapurge.sh

고쳐 쓰다:
내 오류 중 하나를 발견했을 수도 있고, 이것이 오류일 수도 있습니다. 하지만 제 글은 아직 저와는 거리가 멀어서 어쨌든 공유하겠습니다.
파일이 아닌 디렉토리를 삭제하려고 했기 때문에 rm 명령에 -rf 옵션을 추가했습니다. 스크립트를 수정했는데 약 30분 후에 디렉토리 1개가 다시 삭제되어야 합니다.

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
#
#
#Keep the Dahua pics for max x time.
cd /media/pi/USB/Dahua/Dahua/
sudo rm -rf `ls -tl | tail -n +7`

고쳐 쓰다:
여전히 작동하지 않지만 게시된 제안을 시도해보고 가능한 한 빨리 업데이트하겠습니다.

답변1

이 순서대로 확인해야 할 사항은 다음과 같습니다.

  1. 스크립트가 정확한 소유자 설정을 사용하여 명령줄에서 비대화식으로 실행됩니까?

    sudo -H -u user -- command
    
  2. crontab 항목 구문이 정확합니까? 시스템 전체의 crontab에는 또 다른 열이 있습니다. cron 서비스를 다시 로드하는 대신 다시 시작하세요. /var/log/syslogcrontab에 오류가 있으면 적절한 오류 메시지가 표시됩니다.

     Sep  6 15:56:50 myhost cron[834]: (CRON) STARTUP (fork ok)
     Sep  6 15:56:50 myhost cron[834]: Error: bad command; while reading /etc/crontab
     Sep  6 15:56:50 myhost cron[834]: (*system*) ERROR (Syntax error, this crontab file will be ignored)
    

crontab에는 MAILTO이메일 주소를 가리키는 변수가 포함되어 있습니다. 이렇게 하면 스크립트를 디버깅할 수 있습니다. 스크립트가 stdout 또는 stderr로 무언가를 출력할 때마다 해당 내용이 이 주소로 메일로 전송됩니다. 이를 위해서는 MTA(Mail Transfer Agent)가 필요합니다. 구경하다여기.


또 다른 점: 명령의 출력을 전달하는 것은 ls디자인 안티 패턴입니다. *.jpg다음과 같이 5일보다 오래된 파일을 (비재귀적으로) 삭제합니다 .

find /path -maxdepth 1 -type f -name '*.jpg' -ctime +5 -delete

자세한 내용은 을 참조하십시오 man 1 find.

답변2

간단히 말해서 명령의 출력은 다음과 같습니다.

1/여러 사람이 제안한 대로 ls 구문 분석을 중단했습니다. 특히 with 를 사용할 때 rm -rf이제 그 이유를 이해하게 되었습니다. exec rm -rf"비"빈 디렉토리에서는 삭제가 작동하지 않기 때문에 사용해야 했습니다 .

2/루트 계정에서 crontab -e(을 사용하여) 내 작업을 만들었습니다 .sudo su

삼/스크립트의 권한을 변경했습니다(다른 그룹에서도 실행을 사용할 수 있도록 허용함 chmod 756 file).

파일 권한:

root@raspberrypi:/usr/local/bin# ls -l
total 8
-rwxr-xr-- 1 root staff 146 Sep  7 10:13 dahuapurge.sh

스크립트:

#!/bin/bash
#
#
#Keep the most recent Dahua pics.
find /media/pi/USB/Dahua/Dahua/ -maxdepth 1 -type d -name '20*' -mtime +10 -exec rm -rf {} +

crontab의 마지막 몇 줄:

# AUTHOR: - xxxxx xxxx 
# DATE:   - 31/08/2018
# DESCR:  - Purge Cam pics
# LINK:   -
0 1 * * * /usr/local/bin/hikvisionpurge.sh
0 2 * * 2 /usr/local/bin/dahuapurge.sh


그동안 다른 카메라용으로 또 다른 카메라를 만들었고 잘 작동합니다.

관련 정보