Сценарий 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

Короткая опция xargs - -r

Пожалуйста, отредактируйте и добавьте строку из вашего crontab.

Lucas Oman 01.10.2008 16:38

В комментарии ниже он упомянул, что это находится в /etc/cron.daily.

Mark Biek 01.10.2008 16:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
2
9 861
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

скорее, чем

00 3 * * * myscript.sh

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

сценарий находится в /etc/cron.daily/, адрес которого находится в / etc / crontab

Tanj 01.10.2008 16:34

Это способ настройки vixie-cron по умолчанию в дистрибутиве Gentoo. да, это / bin / rm, хотя есть ссылка на / usr / bin / rm. Может быть, в следующий раз я буду использовать какой rm, чтобы найти путь, вместо того, чтобы угадывать

Tanj 01.10.2008 16:57
Ответ принят как подходящий

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

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 '{}' '+'

Charles Duffy 08.10.2008 21:53

не должен заканчиваться поиск на \; ?

user3850 15.12.2008 15:30

Удаление файлов - настолько частая задача, что find также поддерживает действие -delete. Нет явной необходимости делать -exec rm '{}'.

ulidtko 18.01.2011 15:18

Это зависит от вашей находки. У BSD и Linux есть -delete, но у устаревших Unix, вероятно, нет. Обратите внимание, что «старомодный» не означает просто «старый», он также может означать «Solaris». Моя «найти (1) мышечную память» пришла из 80-х, где даже «+» нельзя было использовать с exec, как видно из первой версии моего ответа; Я долгое время использовал команду «найти что угодно -print0 | xargs -0». Очевидно, в какой-то момент я приспособился к пробелам в именах файлов ...

janm 19.01.2011 03:54

-delete недоступен в Ubuntu 16.04. Должно быть старым.

ygoe 03.12.2016 19:08

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

[email protected]

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

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

0 30 * * * /usr/bin/rm /home/user/Maildir/.SPAM/cur/*

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

rm -f

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

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

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

Другие вопросы по теме