2010-03-09 4 views
-1

일부 명령은 stdout에 잡음이 들리고 stderr에는 일부, 둘 중 하나는 모두 시끄러운 명령을 호출하는 스크립트가 있습니다. 나는 스크립트가 cron에 의해 실행되도록 의도했기 때문에 에러 상태에서만 매일 시끄러운 메일을 보내고 싶지 않습니다. 그래서 내가 할 :Bash + cron : 리디렉션 및 복원, stdout 및 stderr이 사용 권한을 거부 함

다음
be_quiet() { 
    # save stderr in FD 3 
    exec 3>&2 

    exec &> /dev/null 
} 

die() { 
    # restore stderr 
    exec 2>&3 

    echo $* > /dev/stderr 
    exit 1 
} 

, 즉

be_quiet 
mkdir -p $CLIENT_ROOT || die "Could not create client root." 
cd $CLIENT_ROOT || die "Could not cd to client root." 

의도가 그렇지 않으면 오류, 아무것도 나오지 않는 경우 나 특정 의미 - 투 - 나 메시지를 얻을 것. 하지만 지금보고있는 것은

line 48: /dev/stderr: Permission denied 

명령 줄에서 실행하면됩니다. cron을 통해 실행될 때 권한 거부 메시지를 제공합니다. 나는 이유가 확실하지 않다. 대신

exec 2>&3 

+0

'exec 3> & 2'이 (가) 정확합니까? stderr는 보통 '2'입니다. –

+0

이것은/dev/stderr에 대한 쓰기 권한이 없음을 의미합니다. cron 작업이 대화 형 쉘과 동일한 사용자 및 그룹 ID로 실행됩니까? .profile의 특정 그룹 (아마도 tty)으로 자동 전환합니까? –

+0

> exec 3> & 2가 맞습니까? 예. 앞에서 말했듯이 이것은 대화식으로 실행될 때 작동합니다. 스크립트보십시오 메아리 "표시 1">>/디바이스/열려진 간부 3> 및 2 간부 및>/디바이스/널 "보이지 않는">>/디바이스/열려진 간부 2> 및 3 에코 에코 "Visible 2">>/dev/stderr 다시 말하지만 이것은 대화식으로 작동하지만 cron을 통해 실패합니다. > cron 작업이 대화 형 셸과 동일한 사용자 및 그룹 ID로 실행됩니까? 예. > .profile의 특정 그룹으로 자동으로 전환합니까? No. – arantius

답변

2

exec 3>&- 
+0

그 기능은 무엇입니까? stdout/stderr에 전체 예제를 포함 할 수 있습니까? –

0

가 왜 그냥은/dev/null로 cron 작업의 표준 출력을 리디렉션합니까? be_quiet 기능을 사용하지 말고, 다이 변경 : 당신의 cron 작업에,

die() { 
    echo "$*" >&2 
} 

다음 : 스크립트가 다이 기능을 사용하여 뭔가를 출력 할 때

* * * * * /path/to/script.sh >/dev/null 

만 크론에서 메일을 받아야합니다.

+0

> 왜 그냥 표준 출력을 리디렉션하지 않는 ... 내가 실행하는 명령 중 일부는 stdout에 잡음이 있고 일부는 stderr (일부는 둘 다) 때문에. 내 질문의 첫 번째 문장에서 말했듯이. – arantius

+0

나는 오해 했음에 틀림 없다, 당신은 오류 조건을 위해서만 우편으로 보내길 원한다고 말했다. 그래서 나는 stdout과 stderr의 모든 것을 전혀보고 싶지 않다고 생각했다. –

관련 문제