Запустить скрипт в неинтерактивной оболочке?

17

У меня есть работа cron, которая запускает скрипт. Когда я запускаю скрипт через интерактивную оболочку (ssh'ed to bash), он работает нормально. Когда скрипт запускается сам по себе через cron, он не работает.

Я предполагаю, что он использует некоторые переменные среды, установленные в интерактивной оболочке. Я собираюсь устранить неполадки в сценарии и удалить их.

После внесения изменений я знаю, что могу поставить скрипт в очередь в cron, чтобы он работал как обычно, но есть ли способ запустить скрипт из командной строки, но сказать, что он будет запускаться так же, как из cron - то есть в неинтерактивной среде?

УХО
источник
Связанный и, следовательно, возможно полезный: «Как получить чистую среду в оболочке ksh?» см. особенно ответ @Gilles относительно unset.
sr_
1
По ссылке @ sr_ я посмотрел вверх env, и вы можете попробовать env -i ./my-script.sh. Кроме того, вы получаете сообщение об ошибке?
Кевин
Какую реализацию cron вы используете?
rozcietrzewiacz
@ Кевин - я скажу об этом, если ты ответишь.
cwd

Ответы:

12

Основные отличия между запуском команды из cron и запуском в командной строке:

  • cron, вероятно, использует другую оболочку (обычно /bin/sh);
  • cron определенно работает в небольшой среде (которая зависит от реализации cron, поэтому проверьте страницу cron(8)or или crontab(5)man; обычно есть только HOME, возможно SHELL, возможно LOGNAME, возможно USER, и небольшая PATH);
  • cron обрабатывает %персонажа специально (он превращается в новую строку);
  • Задания cron выполняются без терминальной или графической среды.

Следующий вызов запустит фрагмент оболочки почти так же, как если бы он был вызван из cron. Я предполагаю, что фрагмент не содержит символов 'или %.

env - HOME="$HOME" USER="$USER" PATH=/usr/bin:/bin /bin/sh -c 'shell snippet' </dev/null >job.log 2>&1

Смотрите также выполнение sh-скрипта из cron , который может помочь решить вашу проблему.

Жиль "ТАК - прекрати быть злым"
источник
Привет @Giles - только что подумал - будет ли запуск сценария, как sudo -u user /path/to/scriptспособ запустить его без каких-либо установленных переменных?
cwd
@cwd Нет, обычно нет. sudoочищает некоторые переменные и устанавливает другие на известное значение, но это зависит от того, как оно настроено. Часто он настроен на сохранение настроек локали и TERM, например.
Жиль "ТАК - перестань быть злым"
2

По ссылке @ sr_ ( Как получить чистую среду в оболочке ksh? ) Я посмотрел env, и вы можете попробовать это:

env -i ./my-script.sh
Kevin
источник
Это хорошо сработало для меня, хотя ответ @Gilles тоже очень хорош.
cwd
@cwd: у меня не работает: echo -e '#!/bin/bash -i\necho interactive $-' > ~/test.sh && chmod +x ~/test.sh && env -i ~/test.shвыводы interactive himB.
Аликс Аксель
1

Я бы посоветовал вам использовать абсолютные пути для ваших сценариев, когда вы помещаете его в cron и используете в другом месте и для всех без исключения команд linux, лучше объявите их как переменные и используйте их!

Gaumire
источник
да. но конечно.
cwd
0

Cron не обязательно использует ту же оболочку, что и вы. проверить:

cat /etc/crontab |grep SHELL

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

Если это проблема - вы можете добавить «bash» в начало вашего скрипта в cron, чтобы заставить этот скрипт выполняться в bash. Если это не решит проблему, дайте мне знать, и я буду копать немного глубже.

Matt
источник
0

Если вы хотите игнорировать некоторые интерактивные вопросы, предоставленные каким-либо сценарием, вы можете попробовать:

yes | your_command

Или, yes "n"если вы не хотите отвечать на все вопросы.

Команда:

да - быть многократно утвердительным да выводит объяснительным или, по умолчанию, 'у', навсегда.

kenorb
источник
0

Чтобы запустить ваш скрипт в неинтерактивной оболочке (не касаясь деталей cron), вы можете сделать это через ssh.

Проверьте, действительно ли вы оказались в неинтерактивной оболочке:

> ssh someuser@somehost tty
not a tty

Выполните скрипт в неинтерактивной оболочке:

> ssh someuser@somehost /tmp/myscript.sh
dokaspar
источник