SIGINT가 하위 프로세스에 도달하지 못하도록 방지

SIGINT가 하위 프로세스에 도달하지 못하도록 방지

일반적으로 사용자가 사용하는 서버를 실행하는 bash 스크립트가 있습니다 Ctrl-C. 종료 시 정리 기능이 실행되며 두 번째로 중단되고 싶지 않습니다 Ctrl-C.

#!/bin/bash

...

function cleanup {
    trap '' INT
    echo -n " Cleaning up..."
    scp $SRV:~/$DIR/server.log . && ssh -t $SRV "rm -rf ~/$DIR"
    echo " Finished."

    exit 0
}
trap cleanup EXIT

...

현재 완료되기 Ctrl-C1초 전에 완료하면 scp스크립트가 무기한 중단됩니다. 나는 이것이 SIGINTbash 스크립트 및 프로세스로 보내는 것과 관련이 있다는 것을 알고 있지만 scp이로 인해 정리가 실패하는 대신 스크립트가 중단되는 이유를 모르겠습니다.

그래서 내 질문은 다음과 같습니다

  1. 이로 인해 스크립트가 중단되는 이유는 무엇입니까?
  2. scpSIGINT가 하위 프로세스 에 도달하는 것을 방지하는 방법은 무엇입니까 ssh?

답변1

trap '' INTSIGINT는 쉘과 모든 하위 프로세스를 무시하도록 설계되었습니다.

strace그러나 의 출력을 보면 위의 SIG_IGN을 취소하는 자체 SIGINT 핸들러가 설치된 scp것처럼 보입니다 .scp

SIGINT를 얻는 것을 방지하는 유일한 방법은 다른 프로세스 그룹에서 실행하는 것입니다. 예를 들면 다음과 같습니다.

perl -MPOSIX -e 'setpgid 0,0; exec @ARGV' scp...

또는

(set -m; scp ... & wait)

stty -isig또는 나중에 설정을 복원하려는 경우에도 Ctrl-C에서 SIGINT 전송을 중지하도록 tty 드라이버에 지시합니다(예: or alone 사용 ).stty intr ''^C

saved=$(stty -g)
stty intr ''
scp ...
stty "$saved"

관련 정보