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

  • Размер входного буфера для MacOS
  • Сохранение текущего стиля командной строки после использования 'su?'
  • Используйте «дружественную» метку на дисках или разделах во FreeBSD
  • Чтение umask для пользователя
  • Есть ли что-то вроде вина для запуска приложений OSX на Linux?
  • mpg321 не автовоспроизведение песен
  • Как я могу получить команду tac в OS X?
  • Глобальная переменная для каждого скрипта
  • 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

    bourne shell, если

    Как проверить, поддерживает ли Wi-Fi-карту Transmit Power Control?

    Как подключить два компьютера Linux с Bluetooth?

    Как избежать sudo при работе с файлами, принадлежащими учетной записи службы?

    Печать полного пути с `ls` и` find`

    Компилировать ядро ​​Linux с динамическим (Un) загружаемым usbserial модулем

    Как вы загружаете Puppy Linux Slacko в командную строку?

    sshpass с SSH работает, но sshpass с SCP не

    gzip: неожиданный конец файла с – как читать файл в любом случае

    Как обернуть команды iptables вокруг сервера Ruby webrick, перемещаясь вверх и вниз в одной команде / скрипте?

    Как тайм-аут и выход, если SQL-запрос занимает более 10 минут, чтобы получить результаты

    Самый безопасный способ аутентификации пользователей с помощью / etc / shadow с помощью PHP?

    Как отформатировать эти два сложных оператора cron?

    rsync разреженного изображения qemu увеличивает размер диска

    Как обрабатывать аудиовход, обрабатывать и перенаправлять аудиовыход

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