2014-02-10 3 views
4

bashrc에 작은 기능이있어서 스크립트를 실행하고 완료되면 출력을 내 이메일로 보낼 수 있습니다. 코드는 다음과 같다 : 기능이두 개의 명령이있는 bash nohup

run ./script.sh arg1 arg2 output 

처럼 사용

run() { 
    [email protected] 
    last="${!#}" 
    rest="${@:1:($#-1)}" 

    (nohup $rest &> $last < /dev/null; mail -s "$rest" "$email" < "$last") & 
} 

그것은 대부분의 시간을 작동하는 것 같군,하지만 때로는 이메일이 스크립트가 완료하더라도 전송되지 않습니다 . 나는 그것이 서버 터미널을 닫는 것과 관련이 있다고 생각한다. 이 경우 스크립트는 nohup으로 인해 계속 실행 중이지만 마지막에 이메일을 보내지 않습니다. 제대로 작동하려면 몇 가지 포인터를 정말 고맙게 생각합니다.

+0

'$ {@ : 1 : ($ # - 1)} ""나쁜 생각이다 - 당신은 스칼라에서 인자 벡터를 정확하게 표현할 수 없다. ('$ {@ : 1 : ($ # - 1)} ')')'을 사용하여'rest = $ {rest [@]} "'(또는 단일 인수 제목 줄'$ {rest [*]} ''... 또는 더 정확하게'printf -v rest_cmd'% q ' "$ {rest [@]}"', "$ rest_cmd"를 메일 인수로 사용) –

+0

팁 주셔서 감사합니다. – skd

답변

5

는이 문제를 해결하기 위해 여러 가지 방법이 있습니다,하지만 난이 추천 할 것입니다 생각 :

run() { 
    [email protected] 
    rest="${@:1:($#-1)}" 

    nohup bash -c "$rest < /dev/null 2>&1 | mail -s \"$rest\" \"$email\"" & 
} 

문제는 nohup 명령은 mail 부분에 적용되지 않았다 따라서 /dev/null 후 세미콜론에서 종료하고 있습니다. (...)은 서브 쉘을 소개하지만 외부 명령이 아니기 때문에 nohup (...)이 작동하지 않습니다. 따라서 bash -c "..."이 필요합니다 (중요하다면 이식성을 높이기 위해 ${SHELL} -c " ..."을 사용할 수도 있습니다). 또 다른 따옴표로 묶을 때 이스케이프해야하는 큰 따옴표가 필요합니다. 또한 임시 파일은 필요하지 않습니다 (어떤 이유로 든 주변에두기를 원하지 않는 한 - 리디렉션을 다시 넣고 | 대신 ;으로 명령을 분리하십시오). 출력 파일을 필요로하지 않고도 rest=... 비트를 사용하지 않고 run script.sh arg1 arg2이라고 부를 수 있습니다. 그러나 이미 다른 코드로 퍼져 나갔다면 그 비트를 남겨 두는 것이 더 간단 할 것입니다. 그 부분은 ...

+0

감사합니다. 사실'''nohup (...)''을 시도해 보았고 실제로 작동하지 않는다고 혼란스러워했습니다! – skd

+0

출력 파일이 유용해서 스크립트를'''nohup bash -c "$ rest &> $ last; mail -s \"$ rest \ "\"$ email \ "<\"$ last \ '''/dev/null/dev/null''을 추가했습니다. – skd

관련 문제