Обычно скрипт работает, но не с cron

У меня есть сценарий, который выглядит так:

#!/bin/bash D=~/brew\ update num=$(ls "$D" | cut -d ' ' -f 2 | sort -nr | head -1) num=$(( num + 1 )) script -q "$D/brew_update $num" brew update 

Этот скрипт всегда работает, но когда я начинаю его с cron 0 */5 * * * ~/bin/brewupdate2 , он говорит об этом в файле в /var/mail

  • emacs - вставлять текст из буфера обмена без форматирования
  • Система Crontab или Root Crontab
  • Разделить оболочку горизонтально, чтобы показать ls -al и pwd
  • Cron, чтобы проверить, запущен ли PHP-скрипт, если он не запускается
  • Недетерминированные ошибки при использовании вложенных sshfs
  • Удалите 50GB самых старых файлов в busybox, когда используемая емкость достигает 95%
  •  ^Dscript: brew: No such file or directory 

    Поэтому я подумал, что он использует sh , но я попробовал sh ~/bin/brewupdate2 и он работал без ошибок.

  • Как я могу перечислить имена каталогов, содержащих имена файлов, соответствующие шаблону?
  • Установка crontab с использованием сценария bash
  • отказоустойчивая замена
  • cronjob для автоматического резервного копирования БД на сегодняшний день с префиксом файла
  • Являются ли несколько записей в журнале @daily crontab упорядоченными, последовательно?
  • Отредактировано /etc/cron.d/anacron, изменения сразу же действуют?
  • 2 Solutions collect form web for “Обычно скрипт работает, но не с cron”

      D=~/brew\ update # the above will never work unless you start script as you # say you are user fred, this full path will always work D=/home/fred/brew\ update 

    Cron работает с разными разрешениями и PATH, чем пользователь, другими словами cron в основном является его собственным пользователем (root), с его собственным PATH и т. Д. Не используйте ~ /, который относится к другому домашнему каталогу, а не к вашему, когда cron запускает job, что ~ / относится к домашнему каталогу пользователя в системе, который запускает задание (в этом случае root). Используйте полный путь для 'brew update' (и, если можете, избавитесь от этого имени каталога с пространством в нем, если оно находится под вашим контролем). Я понятия не имею, что делает cron даже с ~ / в терминах генерации пути, потому что он никогда не будет работать предсказуемо, поэтому я никогда не думал об этом.

    С помощью cron ВСЕГДА используют полные системные пути, или вы получите такие ошибки.

    От serverfault :

    какой пользователь будет работать [cron]?

    Все они работают как root. Если вам нужно иначе, используйте su в скрипте или добавьте запись crontab в crontab пользователя (man crontab) или общесистемный crontab (чье местоположение я не мог сказать вам в CentOS).

    Поэтому теоретически вы можете использовать ~ /, который переводится в корень root, / root /, но это очень плохая идея для читаемости и тестирования и т. Д.

    [обновление] Как уже отмечалось, проблема здесь была «завариванием» в / usr / local / bin, которая не находится в $ PATH Of cron, из-за чего команда «brew» терпит неудачу, файл не найден. Я пропустил эту последнюю строчку. Но тем более причина всегда использовать полные пути. Полные пути по всем программам и файлам разрешат все эти проблемы.

    Как уже упоминалось в ответе @ Lizardx, PATH среды PATH , скорее всего, будет отличаться от переменной вашей учетной записи пользователя. Ошибка, которую вы видите, указывает, что script не может найти команду:

     brew: No such file or directory 

    Самый простой способ исправить ошибку – указать точный путь команды, поданной в script :

     script -q "$D/brew_update $num" /usr/local/bin/brew update 
    Linux и Unix - лучшая ОС в мире.