bash-скрипт запускается из оболочки, но не из cron - PullRequest
8 голосов
/ 01 октября 2008

Cron установка vixie-cron

/etc/cron.daily/rmspam.cron

#!/bin/bash
/usr/bin/rm /home/user/Maildir/.SPAM/cur/*;

У меня есть этот простой bash-скрипт, который я хочу добавить в задание cron (также включает в себя команды по изучению спама), но эта часть всегда завершается с ошибкой «Файл или каталог не найден» правильно работает, когда запускается как задание cron. Если я выполню скрипт из командной строки, он будет работать нормально.

Мне бы хотелось, почему бы это не сработало и, конечно же, сработало решение:)

Спасибо

edit # 1 вернулся к этому вопросу, когда я получил популярный значок вопроса для него. Я впервые сделал это,

#!/bin/bash
find  /home/user/Maildir/.SPAM/cur/ -t file | xargs rm

и совсем недавно читал справочную страницу xargs и изменил ее на

#!/bin/bash
find  /home/user/Maildir/.SPAM/cur/ -t file | xargs --no-run-if-empty rm

опция коротких xargs -r

Ответы [ 5 ]

14 голосов
/ 01 октября 2008

Если в каталоге нет файлов, подстановочный знак не будет расширен и будет передан команде напрямую. Нет файла с именем «*», а затем команда завершается с ошибкой «Файл или каталог не найден». Попробуйте вместо этого:

if [ -f /home/user/Maildir/.SPAM/cur/* ]; then
    rm /home/user/Maildir/.SPAM/cur/*
fi

Или просто используйте флаг "-f" для rm. Другая проблема с этой командой заключается в том, что происходит, когда слишком много спама для максимальной длины командной строки. Что-то вроде этого, вероятно, лучше в целом:

find /home/user/Maildir/.SPAM/cur -type f -exec rm '{}' +

Если у вас есть старая находка, которая одновременно исполняет только один файл:

find /home/user/Maildir/.SPAM/cur -type f | xargs rm

Это обрабатывает слишком много файлов, а не файлов. Спасибо Чарльзу Даффи за указание опции + для -exec в find.

0 голосов
/ 18 января 2011

Действительно ли rm находится в /usr/bin/ в вашей системе? Я всегда думал, что rm должно находиться в /bin/.

0 голосов
/ 01 октября 2008

Попробуйте использовать параметр force и забудьте о добавлении пути к команде rm. Я думаю, что это не нужно ...

rm -f

Это гарантирует, что, даже если в каталоге нет файлов, команда rm не завершится с ошибкой. Если это часть сценария оболочки, * должен работать. Мне кажется, что у вас может быть пустой каталог ...

Я понимаю, что остальная часть сценария выполняется, верно?

0 голосов
/ 01 октября 2008

попробуйте добавить

MAILTO=your@email.address

в начало вашего файла cron, и вы должны получать любые сообщения / ошибки по почте.

Также рассмотрите возможность добавления команды как cronjob

0 30 * * * /usr/bin/rm /home/user/Maildir/.SPAM/cur/*
0 голосов
/ 01 октября 2008

Вы указываете полный путь к скрипту в cronjob?

00 3 * * * /home/me/myscript.sh

вместо

00 3 * * * myscript.sh

С другой стороны, это / bin / rm на всех компьютерах с Linux, к которым у меня есть доступ. Вы дважды проверили, что это действительно / usr / bin / rm на вашей машине?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...