Как записать, что сценарий аварийного прекращения работы на ошибке, не добавляя '|| выходит из $?' к каждой строке?

Из ssh страницы справочника:

Сессия завершается, когда команда или оболочка на удаленных выходах машины и всем X11 и соединениях TCP были закрыты.

Вы уничтожили свою оболочку, но похоже, что некоторое приложение все еще имеет соединение, открытое по переданному порту (агент, X11 или передача, настроенная с -D, -L, -R или их ~/.ssh/config эквивалентный).

Если Вы не знаете, какая программа использует передачу, использовать lsof -p $pid где $pid идентификатор процесса ssh клиента (на клиенте) или sshd процесс, который был родителем оболочки (на сервере) для обнаружения, на каких портах это имеет открытые соединения. Затем используйте lsof -i -n или netstat -pnt и поиск обрабатывает, которые имеют соединения, открытые на этих портах.

7
17.10.2012, 13:02
3 ответа

set -e ?

set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
Set or unset values of shell options and positional parameters.

Change the value of shell attributes and positional parameters, or
display the names and values of shell variables.

 Options:
   -a  Mark variables which are modified or created for export.
   -b  Notify of job termination immediately.
   -e  Exit immediately if a command exits with a non-zero status. 
...
17
27.01.2020, 20:14
  • 1
    Вместо макета, дополняющего Вас, мог заключить документацию в кавычки. –  manatwork 17.10.2012, 13:09
  • 2
    там Вы идете :) –  Chris Card 17.10.2012, 13:39
  • 3
    Обратите внимание, что ненулевые коды возврата только вызывают a set -e сценарий для сбоя, когда коды возврата не тестируются. Точное значение протестированных не легко указать, но основная идея - это failingcmd || nonfailing не сделает целый сбой сценария. –  dubiousjim 17.10.2012, 21:25
  • 4
    Удостоверьтесь, что читали о ловушках. –  l0b0 18.10.2012, 12:44

Вы могли бы присоединиться ко всем командам с && и используйте || exit $? в самом конце блока. Например:

#!/usr/bin/ksh
ls ~/folder &&
cp -Rp ~/folder ~/new_folder &&
rm ~/folder/file03.txt &&
echo "This will be skipped..." ||
exit $?

если существует нет ~/folder/file03.txt файл, последнее echo команда будет пропущена. Необходимо получить что-то вроде этого:

$ ./script.ksh
file01.txt  file02.txt
rm: cannot remove /export/home/kkorzeni/folder/file03.txt: No such file or directory
$ echo $?
1

С наилучшими пожеланиями, Krzysztof

3
27.01.2020, 20:14
  • 1
    Эй спасибо, и добро пожаловать в unix.stackexchange! Поскольку jordanm упомянул, что это складывается exit один будет вести себя тот же путь как exit $? делает –  Tobias Kienzler 18.10.2012, 08:35

Вы можете определить функцию перехвата для перехвата любой ошибки, возникающей в сценарии.

#!/usr/bin/ksh
trap errtrap

function errtrap {
    es=$?
    echo "`date` The script failed with exit status $es " | $log
}

Остальная часть сценария следует.

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

3
27.01.2020, 20:14

Теги

Похожие вопросы