Как выполнить su и запустить скрипт на python в оболочке? - PullRequest
0 голосов
/ 25 сентября 2018

Что я хочу сделать, так это позволить моему сценарию оболочки остановиться, когда мой сценарий python, запускаемый оболочкой, завершится ненормально.Однако я должен выполнить su для ossadm, чтобы запустить скрипт python, как я могу получить правильный код выхода, когда я su

Вот мой код:

# shell script
    su ossadm <<EOF
    . /opt/oss/manager/bin/engr_profile.sh # which only can be executed by ossadm
    python ${SRC_DIR}/main.pyc
    echo $?
    if [[ $? = 0 ]]; then
        echo "success"
    else
        echo "failure: $?"
    fi
EOF

# main.py
def main():
    sys.exit(1) # for testing

, затем запустите скрипт,он всегда печатает "0" и "suceess" , или изменяет последовательность:

    su ossadm <<EOF
    . /opt/oss/manager/bin/engr_profile.sh # which only can be executed by ossadm
    python ${SRC_DIR}/main.pyc
EOF
    echo $?
    if [[ $? = 0 ]]; then
        echo "success"
    else
        echo "failure: $?"
    fi

# main.py
def main():
    sys.exit(1) # for testing

Это даст мне более странные "1" и "успех".

Может ли такая обработка выполняться в сценарии оболочки?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

В зависимости от вашей оболочки вы можете попробовать что-то вроде этого.

su ossadm -c '. /opt/oss/manager/bin/engr_profile.sh; 
python "${SRC_DIR}"/main.pyc'  && echo "sucess" || echo "failure"

Здесь -c flag будет запускать команды как ossadm.

Где && логично, а какоезапускает блок кода после него, если предыдущая команда выполнена успешно.|| является логическим или кодовый блок после этого запускается в случае сбоя предыдущей команды.

Для большей ясности вы можете поместить код успеха и неудачи в разные файлы

su ossadm -c '. /opt/oss/manager/bin/engr_profile.sh;
python "${SRC_DIR}"/main.pyc' && /tmp/b.sh || /tmp/c.sh

Гдеb.sh запускается, когда команда su (в вашем случае сценарий python) завершается с кодом '0' и.c.sh запускается при выходе команды su (в вашем случае сценария python) с кодом '1'

0 голосов
/ 25 сентября 2018

Вам нужно указать EOF токен.В противном случае переменные в here-doc расширяются исходной оболочкой, поэтому $? содержит состояние выхода последней команды, которую вы выполнили до su.

# shell script
su ossadm <<'EOF'
    . /opt/oss/manager/bin/engr_profile.sh # which only can be executed by ossadm
    python "${SRC_DIR}"/main.pyc
    status=$?
    echo $status
    if [[ $status = 0 ]]; then
        echo "success"
    else
        echo "failure: $?"
    fi
EOF

Если SRC_DIR - это переменная, установленная в исходной оболочке, убедитесь, что вы экспортировали ее, чтобы она была унаследована оболочкой, запущенной su, поскольку она больше не будет расширятьсяоригинальная оболочка.Но если он установлен на engr_profile.sh, кавычка токена заставит его правильно раскрыться.

Причина, по которой вы получаете 1 и success во второй версии, заключается в том, что оператор echo устанавливает $? основано на собственном успехе.Если вы хотите напечатать состояние выхода, а также протестировать его, вам нужно сохранить его в другой переменной, как я сделал с переменной status выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...