скрипт bash запускается из командной строки, но не из задания cron
Вопрос
Установка Cron - это vixie-cron
/etc/cron.daily/rmspam.cron
#!/bin/bash
/usr/bin/rm /home/user/Maildir/.SPAM/cur/*;
У меня есть этот простой скрипт bash, который я хочу добавить к заданию cron (ранее также включал команды изучения нежелательной почты), но эта часть всегда завершается с ошибкой "Файл или каталог не найден", из чего я заключаю, что метасимвол неправильно интерпретируется при запуске в качестве задания cron.Если я выполняю скрипт из командной строки, он работает нормально.
Я бы хотел узнать, почему это не работает, и, конечно, найти рабочее решение :)
Спасибо
редактировать # 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
опция short xargs - это -r
Решение
Если в каталоге нет файлов, то подстановочный знак не будет расширен и будет передан команде напрямую.Нет файла с именем "*", и затем команда завершается с ошибкой "Файл или каталог не найден". Попробуйте это вместо:
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, которая запускает rm только по одному файлу за раз:
find /home/user/Maildir/.SPAM/cur -type f | xargs rm
Это обрабатывает как слишком много файлов, так и их отсутствие.Спасибо Чарльзу Даффи за указание опции + для -exec в find.
Другие советы
Вы указываете полный путь к скрипту в cronjob?
00 3 * * * /home/me/myscript.sh
вместо того , чтобы
00 3 * * * myscript.sh
С другой стороны, это /бункер/rm на всех ящиках Linux, к которым у меня есть доступ.Вы перепроверили, что это действительно так /usr/bin/rm на вашем компьютере?
попробуйте добавить
MAILTO=your@email.address
в начало вашего cron-файла, и вы должны получить любые входные данные / ошибки, отправленные вам по почте.
Также рассмотрите возможность добавления команды в качестве cronjob
0 30 * * * /usr/bin/rm /home/user/Maildir/.SPAM/cur/*
Попробуйте использовать принудительную опцию и забудьте о добавлении пути к команде rm.Я думаю, что в этом не должно быть необходимости...
rm -f
Это гарантирует, что даже если в каталоге нет файлов, команда rm не завершится ошибкой.Если это часть сценария оболочки, * должно сработать.Мне кажется, что у вас может быть пустой каталог...
Я понимаю, что остальная часть скрипта выполняется, не так ли?
Является rm
действительно расположенный в /usr/bin/
в вашей системе?Я всегда думал, что rm
должен проживать в /bin/
.