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


17

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

Я здогадуюсь, що він використовує деякі змінні середовища, встановлені в інтерактивній оболонці. Я збираюся вирішити сценарій та видалити їх.

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


Пов'язане та, можливо, корисне: "Як отримати чисту середу в оболонці ksh?" див. особливо відповідь @Gilles щодо unset.
sr_

1
Зі посилання @ sr_, я подивився env, і ви можете спробувати env -i ./my-script.sh. Також ви отримуєте повідомлення про помилку?
Кевін

Яку реалізацію cron ви використовуєте?
rozcietrzewiacz

@kevin - я схвалюю це, якщо ви відповісте на нього.
cwd

Відповіді:


12

Основні відмінності між запуском команди від cron та запуском у командному рядку:

  • cron, ймовірно, використовує іншу оболонку (як правило /bin/sh);
  • cron, безумовно, працює в невеликому середовищі (які залежать від впровадження cron, тому перевірте сторінку cron(8)або 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 із крона , який може допомогти вирішити вашу проблему.


Привіт @Giles - просто щось придумав - запустив би такий сценарій, як sudo -u user /path/to/scriptі спосіб його запуску без встановлених змінних?
cwd

@cwd Ні, зазвичай ні. sudoочищає деякі змінні та встановлює іншим відоме значення, але це залежить від способу налаштування. Він часто налаштовується, щоб зберегти параметри локалі та TERM, наприклад.
Жил "ТАК - перестань бути злим"

2

За посиланням @ sr_ ( Як отримати чисте середовище в оболонці ksh? ), Я переглянув env, і ви можете спробувати це:

env -i ./my-script.sh

Це добре працювало для мене, хоча відповідь @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, що використовуються в ньому, краще оголосити їх як змінні та використовувати їх!


так. але, звичайно.
cwd

0

Cron не обов'язково використовує ту саму оболонку, яку ви використовуєте. чек:

cat /etc/crontab |grep SHELL

Щоб визначити оболонку та спробувати виконати ваш скрипт там - чи це працює? Це є загальною причиною виникнення проблем для багатьох людей, що додають сценарії до cron.

Якщо це проблема - ви можете додати "bash" до початку свого сценарію в cron, щоб змусити цей сценарій виконувати в bash. Якщо це не вирішить питання, дайте мені знати, і я копаю трохи глибше.


0

Якщо ви хочете ігнорувати деякі інтерактивні запитання, надані певним сценарієм, ви можете спробувати:

yes | your_command

Або yes "n"якщо ви хочете, щоб не всі питання.

Команда:

так - будьте повторно стверджуючими, так виводиться експлікативно, або, за замовчуванням, "y", назавжди.


0

Щоб запустити свій скрипт у неінтерактивній оболонці (не враховуючи деталей cron), це можна зробити за допомогою ssh.

Перевірте, чи дійсно ви потрапили в неінтерактивну оболонку:

> ssh someuser@somehost tty
not a tty

Виконайте сценарій у неінтерактивній оболонці:

> ssh someuser@somehost /tmp/myscript.sh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.