скрипт bash запускается из командной строки, но не из задания cron

StackOverflow https://stackoverflow.com/questions/157342

  •  03-07-2019
  •  | 
  •  

Вопрос

Установка 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/.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top