2014-11-10 3 views
1


Мне нужна помощь с некоторыми сценариями, которые я пишу.
Сценарий:код выхода из сценария потока

  • Сценарий выполняется с помощью процесса планирования. Этот скрипт принимает переданные ему аргументы, каким-то образом разбирает их и запускает скрипт B, который передает эти аргументы;
  • Script B делает Суд -u пользователя SSH пользователя @ REMOTEMACHINE, выполняет некоторые команды (на удаленной машине) и, наконец, запускает скрипт C (также на удаленной машине). Я передаю эти команды с помощью ЗДЕСЬ ДОКУМЕНТ. Кроме того, я передаю предыдущие аргументы этому сценарию.
  • Этот «поток» работает правильно, и работа завершается успешно.

Мои проблемы:

  • Поскольку этот «поток» побежал на процесс планирования, я должен сказать, если работа выполнена успешно или нет. Я делаю это с помощью кодов выхода, поэтому я хочу иметь цепочку кода выхода, возвращаясь от последнего сценария к первому, в случае ошибок. Я не могу выполнить это, потому что коды выхода работают правильно для отдельных скриптов (я попытался выполнить их сингулярно и искать коды выхода), но они не возвращаются к родительскому скрипту. На мой взгляд, проблема заключается в том, что ssh получает код выхода из дочернего скрипта, который на самом деле закончился успешно, потому что не было ошибки, выполняемой им: это внутренняя команда, которая пошла не так.
  • Хотя процесс работает правильно, я все еще получаю эту строку:

    ssh: Could not resolve hostname : Name or service not known

Но на самом деле сценарий завершается успешно.

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

Благодаря

О.


EDIT:
Это те сценарии. Может возникнуть проблема с именами переменных, потому что я переименовал ее quikly для загрузки файлов.
Поскольку я не могу загрузить 3 файла из-за моей низкой репутации, я слил их в одном файле
SCRIPT FILE

+2

Пожалуйста, дайте свои сценарии. –

+0

Вам просто нужно, чтобы каждый скрипт возвращал ошибку, если один из них произошел, вместо того, чтобы всегда возвращать 0, поскольку «не было ошибки, выполняющей его» (хотя команда внутри пошла не так!). то вы могли бы связать их с «&&» вместо «;» если каждый скрипт должен удостовериться, что предыдущий (ы) закончен успешно –

+0

@OlivierDulac Я не понимаю, что вы сказали. Я попытался связать команды во втором скрипте с командой &&, а также попытался выполнить их отдельно (один ssh для kinit, а затем другой ssh ​​для запуска скрипта), но проблема остается. – Omar

ответ

1

мне удалось решить эту проблему.
Я следил за советом Оливье и использовал escape-символ, чтобы переменная была расширена удаленной машиной.
Также я реализовал различные коды выхода, основанные на том, где произошла ошибка.
Наконец, я изменил первый сценарий следующим образом, после запуска Суд -u для второго сценария:

EXITCODEOFTHESECONDSCRIPT=$?  
if [ $EXITCODEOFTHESECONDSCRIPT = 0 ] 
    then 
     echo "" 
     echo "Export job took $SECONDS seconds." 
     echo "" 
     exit 0 
else 
    exit $EXITCODEOFTHESECONDSCRIPT 
fi 

Таким образом, я могу выйти из основного сценария ПОДДЕРЖАНИЯ код выхода, предоставляемых из второго сценария. На самом деле я обнаружил, что проблема заключалась в том, что процесс работал хорошо, даже в случае ошибок, но тот факт, что я выдавал больше команд после неудачного второго скрипта (команда эха была достаточной) предоставляла другие коды выхода, которые перезаписывали я хотел.

Спасибо всем!

+0

Я знал, что вы это сделаете :) Обычный подход заключается в записи кода выхода важных шагов с помощью чего-то вроде 'errcode = $?' Сразу после этого шага, а затем вы можете «вернуть $ errcode» для возврата из функции или 'exit $ errcode', чтобы выйти из скрипта с тем же кодом, независимо от того, что вы делали после того, как сделал важный шаг –