У меня есть работа cron, которая запускает скрипт. Когда я запускаю скрипт через интерактивную оболочку (ssh'ed to bash), он работает нормально. Когда скрипт запускается сам по себе через cron, он не работает.
Я предполагаю, что он использует некоторые переменные среды, установленные в интерактивной оболочке. Я собираюсь устранить неполадки в сценарии и удалить их.
После внесения изменений я знаю, что могу поставить скрипт в очередь в cron, чтобы он работал как обычно, но есть ли способ запустить скрипт из командной строки, но сказать, что он будет запускаться так же, как из cron - то есть в неинтерактивной среде?
unset
.env
, и вы можете попробоватьenv -i ./my-script.sh
. Кроме того, вы получаете сообщение об ошибке?Ответы:
Основные отличия между запуском команды из cron и запуском в командной строке:
/bin/sh
);cron(8)
or илиcrontab(5)
man; обычно есть толькоHOME
, возможноSHELL
, возможноLOGNAME
, возможноUSER
, и небольшаяPATH
);%
персонажа специально (он превращается в новую строку);Следующий вызов запустит фрагмент оболочки почти так же, как если бы он был вызван из cron. Я предполагаю, что фрагмент не содержит символов
'
или%
.Смотрите также выполнение sh-скрипта из cron , который может помочь решить вашу проблему.
источник
sudo -u user /path/to/script
способ запустить его без каких-либо установленных переменных?sudo
очищает некоторые переменные и устанавливает другие на известное значение, но это зависит от того, как оно настроено. Часто он настроен на сохранение настроек локали иTERM
, например.По ссылке @ sr_ ( Как получить чистую среду в оболочке ksh? ) Я посмотрел env, и вы можете попробовать это:
источник
echo -e '#!/bin/bash -i\necho interactive $-' > ~/test.sh && chmod +x ~/test.sh && env -i ~/test.sh
выводыinteractive himB
.Я бы посоветовал вам использовать абсолютные пути для ваших сценариев, когда вы помещаете его в cron и используете в другом месте и для всех без исключения команд linux, лучше объявите их как переменные и используйте их!
источник
Cron не обязательно использует ту же оболочку, что и вы. проверить:
Определить оболочку и выполнить там попытку вашего скрипта - это работает? Это распространенная причина проблем для многих людей, добавляющих скрипты в cron.
Если это проблема - вы можете добавить «bash» в начало вашего скрипта в cron, чтобы заставить этот скрипт выполняться в bash. Если это не решит проблему, дайте мне знать, и я буду копать немного глубже.
источник
Если вы хотите игнорировать некоторые интерактивные вопросы, предоставленные каким-либо сценарием, вы можете попробовать:
Или,
yes "n"
если вы не хотите отвечать на все вопросы.источник
Чтобы запустить ваш скрипт в неинтерактивной оболочке (не касаясь деталей
cron
), вы можете сделать это черезssh
.Проверьте, действительно ли вы оказались в неинтерактивной оболочке:
Выполните скрипт в неинтерактивной оболочке:
источник