У меня странное поведение со сценарием оболочки на Ubuntu 12.04.1 LTS.

Мой скрипт планируется запускать каждый час (в crontab). Он использует /bin /bash, но иногда переключается на /bin /sh без какой-либо причины.

Вот некоторые части команды env, которые я записываю из скрипта.

Правильный:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/jdk/jdk1.6.0_35/bin

Иногда встречается неправильное:

SHELL=/bin/sh
PATH=/usr/bin:/bin

Проблема в том, что я теряю переменную PATH и получаю сообщение об ошибке при попытке запустить команду.

Любой намек? Спасибо!

3 ответа3

2

Трудно сказать, почему это иногда работает, а иногда нет. Итак, вот некоторые идеи, которые могут или не могут помочь.

Проверьте, что ваш скрипт начинается с

#!/bin/bash

и убедитесь, что скрипт запущен с правильным пользователем: это заставит bash загрузить правильную среду для этого пользователя.

Если вы хотите быть уверенным, вы также можете явно запустить bash в вашем crontab , а затем передать скрипт для запуска с аргументом -c .

Если это не помогает и вам нужно быстрое решение, вы можете запустить команды в своем скрипте, используя их полный путь, поэтому вам вообще не нужен правильный PATH .

Примечание: этот вопрос лучше подошел бы к Server Fault или Unix и Linux.

0

Переменная SHELL - это оболочка входа в систему, а не обязательно оболочка, в которой вы сейчас работаете.

Наиболее вероятная причина различий заключается в том, что иногда вы запускаете из интерактивной оболочки, а иногда нет (cron), в каждом случае запускаемые файлы запуска отличаются.

Когда вы запускаете под cron, это не оболочка входа в систему, поэтому ваш .profile не запускается - наиболее вероятная причина, по которой ваш PATH отличается.

В начале вашего сценария поставьте:

source ~/.profile

(или используйте . вместо source)

0

Поместите это в самом начале вашего сценария:

#!/bin/bash
if [ "$(readlink -f /proc/$$/exe)" != "/bin/bash" ] ; then
    echo restarting script with bash... > &2
    exec /bin/bash $0 "$@"
fi

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .