1

Вот как я регистрирую как stdout, так и stderr в моих скриптах (обычно cronjobs):

#!/bin/bash
mylog() {
    echo "[`date '+%Y-%m-%d %H:%M:%S'`] $1"
}
(
mylog 'start'

some-command || mylog 'error' && exit 1

mylog 'end'
) >> /var/log/my-log.log 2>&1

В некоторых сценариях я использую return вместо exit и работает нормально, но теперь говорится, что я не могу использовать return, если я не включу сценарий с помощью src или не использую его в функции. Поэтому я изменил его для выхода, но проблема в том, что он ничего не регистрирует, похоже, он останавливает перенаправление >> выхода. Другая проблема заключается в том, что я не смогу позже включить его в src, потому что я хочу остановить только этот скрипт, а не все.

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

Итак, как я могу «вернуться» в случае ошибки? Я знаю о 'set -e', но предпочитаю больше контролировать, когда останавливать скрипт.

Какие-нибудь мысли?

2 ответа2

1

Я не могу объяснить поведение, которое вы испытываете, но вот возможное исправление:

#!/bin/bash
mylog() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

mymain() {
    (
        mylog 'start'

        some-command  ||  mylog 'error'  &&  return 1

        mylog 'end'
    ) >> /var/log/my-log.log 2>&1
}

mymain

Или удалите перенаправление из определения функции mymain и поместите его в вызов функции mymain :

mymain >> /var/log/my-log.log 2>&1

(Вы также сможете удалить скобки из определения функции mymain .)  В качестве альтернативы, поскольку вы хотите, чтобы ввод-вывод был перенаправлен для всего сценария, вы можете нарушить перенаправление отдельно от операторов действия:

exec >> /var/log/my-log.log
exec 2>&1
mymain

Поскольку я не понимаю, почему ваш подход терпит неудачу, я не могу объяснить, почему любое из вышеперечисленного с большей вероятностью будет работать так, как нужно.  Тем не менее, это несколько разные способы сделать то же самое, и этого может быть достаточно.  Кстати, я изменил `date …` на $(date …) только по общим причинам; Я не верю, что это как-то связано с твоей проблемой.

0

Как насчет использования команды screen в Linux? Это может быть уловкой, если только вы не решитесь сами программировать решение.

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