Невозможно удалить файлы с помощью Cron

Я работал над тем, чтобы понять это в течение нескольких дней. У Google есть много ответов, но ни один из них не решает эту проблему. Я надеялся, что у кого-то еще была эта проблема, и он знает, что делать, чтобы исправить это.

Итак, проблема: я хотел бы удалить файлы старше 3 дней с помощью Cron.

Мой Кронтаб:

#       m       h       dom     mon     dow     command
SHELL=/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin
*/1     *       *       *       *       /root/insert.sh
0       0       *       *       *       /root/backup.sh
*/1     *       *       *       *       find /root/backups -mtime +3 -exec /bin/rm {} \;

С этим Crontab /root/backup.sh запускается в полночь каждую ночь, и это работает. Также каждую минуту работает /root/insert.sh (запускает php-скрипт для перемещения некоторых данных в другую папку).

Я зашел в /root/backups и вручную набрал find /root/backups -mtime +15 -exec rm {} \;, и это сработало. Он удалил все файлы старше 15 дней.

Чтобы убедиться, что cron выполняет эту строку кода. Я запустил tail -f /var/log/syslog | grep CRON (у меня сервер ubuntu 13.04)

Jul 24 07:47:01 myServer CRON[13934]: (root) CMD (find /root/backups -mtime +3 -exec rm {} \;)
Jul 24 07:48:01 myServer CRON[13937]: (root) CMD (/root/insert.sh)
Jul 24 07:48:01 myServer CRON[13938]: (root) CMD (find /root/backups -mtime +3 -exec rm {} \;)
Jul 24 07:49:01 myServer CRON[13954]: (root) CMD (/root/insert.sh)
Jul 24 07:49:01 myServer CRON[13955]: (root) CMD (find /root/backups -mtime +3 -exec /bin/rm {} \;)

Таким образом, вы можете видеть, что он работает. Я попытался поместить PATH в свой crontab. Я пытался поставить /bin/rm вместо rm. Кто-то предложил убедиться, что в конце crontab есть CR. Оно делает.

Несмотря на то, что это cron root, я сделал chmod a+rwx backups, так что любой может изменить эту папку. Там все равно не повезло.

Я пробовал rm -fr /root/backups и /bin/rm -fr /root/backups в своем crontab, и это не сработало. Если я сделаю /bin/rm -fr /root/backups >> /root/logmeplease.log 2>&1 и ничего не зарегистрируется.

Наконец, я попытался поместить это в сценарий оболочки.

#!/bin/bash

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

find /root/backups -mtime +5 -exec /bin/rm {} \;

Опять же, это имеет CR в нижней части файла. Этот скрипт работает при ручном запуске, но cron его не запустит. Я также пробовал #!/bin/bash -l и #!/bin/bash -x вверху.

Есть ли что-то действительно простое, что мне не хватает, почему мой корневой cron не удаляет файлы? А в системном журнале видно, что запущен скрипт или команда?

Спасибо за любую помощь в этом!


person btryba    schedule 24.07.2013    source источник
comment
Когда вы используете bash -x, вы получаете электронное письмо с расшифровкой сценария?   -  person Barmar    schedule 24.07.2013
comment
Вы пробовали /usr/bin/find вместо find?   -  person uzsolt    schedule 24.07.2013
comment
Я думаю, это потому, что cron использует sh, а не bash. Измените первую строку SHELL=/bin/sh на SHELL=/bin/bash. Это помогает?   -  person jsp    schedule 24.07.2013
comment
@uzsolt пробовал, но не помогло.   -  person btryba    schedule 24.07.2013
comment
@jsp сделал это! Спасибо! (Также мне пришлось переместить PATH на следующую строку.)   -  person btryba    schedule 24.07.2013
comment
Используйте find ... -exec rm {} + для удаления нескольких файлов одной командой rm. Или, скорее, используйте find ... -delete, чтобы избежать вызова внешней функции.   -  person TrueY    schedule 25.07.2013


Ответы (3)


чтобы быть более надежным, вы должны написать find ... в отдельном файле сценария. например

#! /bin/bash

/usr/bin/find .... -delete \;

Чтобы протестировать скрипт, запустите его без среды, т.е. станьте суперпользователем и запустите

env -i  myCronScript

и посмотреть, что происходит. Это условия, при которых cron запускает ваш скрипт.

person tue    schedule 25.07.2013
comment
Вам не нужно использовать отдельный файл, но cron будет терпеть неудачу, если вы не используете абсолютный путь. - person moebius_eye; 29.08.2013

cron по умолчанию использует sh, и, пожалуйста, проверьте псевдонимы в этой оболочке. Вы можете обнаружить, что команда rm вынуждена запрашивать приглашение при использовании sh-shell:

root@server1]# env | grep  SHELL
SHELL=/bin/sh
[root@server1]# alias
...
alias rm='rm -i'

Вот почему переход на bash может помочь, потому что таких псевдонимов нет.

person offzet    schedule 07.03.2018

Уважаемый Crontab по умолчанию использует оболочку sh вместо bash. вы можете использовать /dev/null для очистки файлов. проверьте ниже скрипт. это поможет.

#!/bin/bash
tar=$(ls -lt /backup/manual | grep ^d | tail -n1 | awk '{print $NF}')
for i in $(find /backup/manual/"$tar" -type f ) 
 do cat /dev/null > "$i" 
done > /dev/null 2>&1 && mv /backup/manual/"$tar" /tmp/

объяснение: пожалуйста, используйте цикл for для доступа ко всем файлам из целевых папок, сделайте их нулевыми и, наконец, переместите в каталог /tmp

person linux.cnf    schedule 27.09.2020