명령 실패 시 출력을 리디렉션하고 종료하는 방법은 무엇입니까?

명령 실패 시 출력을 리디렉션하고 종료하는 방법은 무엇입니까?

이것은 내 스크립트(보통 cronjobs)에 stdout과 stderr을 모두 기록하는 방법입니다.

#!/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을 사용하여 잘 작동하지만 이제 src와 함께 스크립트를 포함하거나 함수에서 사용하지 않으면 return을 사용할 수 없다고 말합니다. 그래서 종료하도록 변경했는데 문제는 아무것도 기록하지 않고 >> 출력 리디렉션을 중지하는 것 같습니다. 또 다른 문제는 나중에 src에 이를 포함시킬 수 없다는 것입니다. 왜냐하면 저는 모든 것이 아니라 이 스크립트만 중지하고 싶기 때문입니다.

오류가 발생하지 않더라도 모든 것을 기록하고 싶기 때문에 출력 리디렉션을 사용합니다. 때로는 명령이 적절한 종료 코드를 반환하지도 않아서 믿을 수 없습니다.

그러면 오류 발생 시 어떻게 '복귀'할 수 있나요? 나는 'set -e'에 대해 알고 있지만 스크립트를 중지할 시기를 더 잘 제어할 수 있는 것을 선호합니다.

이견있는 사람?

답변1

현재 겪고 있는 문제를 설명할 수 없지만 가능한 해결 방법은 다음과 같습니다.

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

내 주요() {
    (
        마이로그 '시작'

        일부 명령 || mylog '오류' && 1을 반환합니다.

        마이로그 '끝'
    ) >> /var/log/my-log.log 2>&1
}

내 주요

또는 함수 정의에서 리디렉션을 제거하고 mymain이를 mymain함수 호출에 추가합니다.

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

(그러면 함수 정의에서 괄호도 삭제할 수 있어야 합니다 mymain.) 또는 IO가 다음과 같이 리디렉션되기를 원하기 때문에전체스크립트를 사용하면 작업 문과 별도로 리디렉션을 중단할 수 있습니다.

exec >> /var/log/my-log.log
실행 2>&1
내 주요

귀하의 접근 방식이 실패한 이유를 이해할 수 없기 때문에 위의 방법 중 어느 것도 원하는 대로 작동할 가능성이 더 높은 이유를 설명할 수 없습니다. 그러나 동일한 작업을 수행하는 방법은 약간 다르므로 그것만으로도 충분할 수 있습니다. 그건 그렇고, 나는 일반적인 이유로 `date …`변경 했습니다. $(date …)나는 그것이 당신의 문제와 관련이 없다고 생각합니다.

답변2

screen리눅스에서 명령을 사용하는 것은 어떻습니까 ? 솔루션을 직접 프로그래밍하려는 마음이 없다면 이는 트릭 때문일 것입니다.

관련 정보