Обычно скрипт работает, но не с 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

 ^Dscript: brew: No such file or directory 

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

  • Как отсортировать по 2 столбцам и сохранить верхнюю строку из каждой группы?
  • Почему блокирование доменов / etc / hosts после добавления заблокированных сайтов через запуск?
  • Проверка воспроизведения звукового файла
  • О взаимосвязи между инициализацией оболочки и настольными приложениями после «графического входа»
  • Создание двоичного файла определенной длины
  • Bash внутри Vim не работает должным образом
  • OS X El Capitan, systemstats: com.apple.telemetry.shutdown
  • Как связать библиотеку OpenSSL в macOS с помощью gcc?
  • 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 
    Interesting Posts

    Чтение и добавление в файл одновременно с сохранением конца строки

    Является ли PowerVM полной операционной системой? (И другие разъяснения.)

    Systemd убивает сервис сразу после запуска

    Как я могу маскировать только определенную подсеть с firewalld?

    Редактируйте несколько строк из определенного раздела INI-файла

    Virtualbox – как предоставить доступ к Интернету и доступ к внутренней сети двум виртуальным машинам?

    Сделать curl / cat не прокручивать вниз, если вам нужен длинный текст?

    См. Информацию о потреблении диска, используя команду «df» в AIX

    Как заставить UUENCODE работать?

    Как я могу повторить знаки доллара?

    Что такое inode для сокета?

    Группируйте все строки на основе первого столбца, затем вычислите общее количество второго и третьего столбцов

    Включение FIPS в зашифрованной системе CentOS с помощью luks ломает пароль для загрузки

    Как настроить обратный FTP в RHEL?

    Откройте окно командной строки в GNOME Desktop

    Linux и Unix - лучшая ОС в мире.