2016-09-06 1 views
0

ssh 시간 초과 나 터미널이 닫힌 경우에도 bash 함수를 계속 실행하려고합니다. 별도로 호출 할 새 스크립트 파일을 만들고 싶지 않기 때문에 nohup과 '&'메서드를 사용하여 목표를 달성했습니다.왜 부모가 죽었을 때 bash 백엔드 함수가 실패를 리턴합니까?

(
    trap "" HUP 
    sleep 10 
    echo 'abc123!' | sudo -S -p '' bash -c "cat /etc/shadow" 
    ret=$? 
    if [ $ret -ne 0 ]; then 
    echo "failed-->$ret" >> /tmp/test.log 
    fi 
)& 

위의 내용은 부모가 죽은 후에 계속 실행해야하는 사람들을 나타내는 스크립트 중 일부입니다. 스크립트는 루트가 아닌 사용자가 실행하므로 sudo를 사용하여 일부 명령을 실행해야합니다. 이 스크립트는 해당 부모가 활성 상태 일 때 성공적으로 반환합니다. 그러나 실행 중일 때 터미널을 닫으면 자식 프로세스가 종료 된 후 test.log 파일에서 'failed -> 1'이됩니다. 그러면 스크립트의 문제점을 누구에게 말해 줄 수 있습니까?

+0

일부는 구현에 따라 다르므로 이것이 확실한 대답이라고 말하지 마십시오. 보통 시그널 마스크 (무시 된 시그널)는 자식 프로세스에 의해 상속되지만,'sudo'는 시그널 핸들링을하고'trap'을 오버라이드 할 것입니다. 사용자 프로세스가 보낸 SIGHUP은 실행중인 명령으로 전달되지만 시스템에서는'man sudo'를 실행하고 권위있는 응답을 위해'신호 처리 '를 검색합니다. – cdarke

+0

'shopt -u huponexit' 시도 – cdarke

+0

궁금한데 왜'bash -c'가 필요한가요? 'cat'은'bash'에 연결되지 않은 외부 프로그램입니다. – cdarke

답변

0
.. 아직 근본 원인에 대한 확실하지 내가이 문제를 해결 내 자신의 질문에 대답하지만,

을 난에 'sudo는'의 코드 변경 :

echo 'abc123!' | sudo -S -p '' cat /etc/shadow > /tmp/test.log 2>&1 

이 가능한 이유는 터미널을 닫을 때를 표준 출력 새 표준 출력을 명시 적으로 할당해야합니다.