이것은 내 스크립트(보통 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
리눅스에서 명령을 사용하는 것은 어떻습니까 ? 솔루션을 직접 프로그래밍하려는 마음이 없다면 이는 트릭 때문일 것입니다.