Установка 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
Короткая опция xargs - -r
В комментарии ниже он упомянул, что это находится в /etc/cron.daily.





Вы указываете полный путь к скрипту в задании cron?
00 3 * * * /home/me/myscript.sh
скорее, чем
00 3 * * * myscript.sh
С другой стороны, это / bin / rm на всех ящиках Linux, к которым у меня есть доступ. Вы дважды проверили, действительно ли это / usr / bin / rm на вашем компьютере?
сценарий находится в /etc/cron.daily/, адрес которого находится в / etc / crontab
Это способ настройки vixie-cron по умолчанию в дистрибутиве Gentoo. да, это / bin / rm, хотя есть ссылка на / usr / bin / rm. Может быть, в следующий раз я буду использовать какой rm, чтобы найти путь, вместо того, чтобы угадывать
Если в каталоге нет файлов, то подстановочный знак не будет расширен и будет передан команде напрямую. Нет файла с именем «*», а затем команда завершается ошибкой с сообщением «Файл или каталог не найден». Попробуйте вместо этого:
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.
На самом деле, вам не нужны xargs с достаточно новой находкой: find /home/user/Maildir/.SPAM/cur -type f -exec rm -f '{}' '+'
не должен заканчиваться поиск на \; ?
Удаление файлов - настолько частая задача, что find также поддерживает действие -delete. Нет явной необходимости делать -exec rm '{}'.
Это зависит от вашей находки. У BSD и Linux есть -delete, но у устаревших Unix, вероятно, нет. Обратите внимание, что «старомодный» не означает просто «старый», он также может означать «Solaris». Моя «найти (1) мышечную память» пришла из 80-х, где даже «+» нельзя было использовать с exec, как видно из первой версии моего ответа; Я долгое время использовал команду «найти что угодно -print0 | xargs -0». Очевидно, в какой-то момент я приспособился к пробелам в именах файлов ...
-delete недоступен в Ubuntu 16.04. Должно быть старым.
попробуйте добавить
[email protected]
вверху вашего cron-файла, и вы должны будете получать сообщения об ошибках и вводимых данных по почте.
Также рассмотрите возможность добавления команды как cronjob
0 30 * * * /usr/bin/rm /home/user/Maildir/.SPAM/cur/*
Попробуйте использовать параметр force и забудьте о добавлении пути к команде rm. Думаю, в этом не должно быть необходимости ...
rm -f
Это гарантирует, что даже если в каталоге нет файлов, команда rm не завершится ошибкой. Если это часть сценария оболочки, * должен работать. Мне кажется, у вас может быть пустой каталог ...
Я так понимаю, что остальная часть скрипта выполняется, верно?
Действительно ли rm находится в /usr/bin/ вашей системы? Я всегда думал, что rm должен находиться в /bin/.
Пожалуйста, отредактируйте и добавьте строку из вашего crontab.