일반적으로 사용자가 사용하는 서버를 실행하는 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-C
1초 전에 완료하면 scp
스크립트가 무기한 중단됩니다. 나는 이것이 SIGINT
bash 스크립트 및 프로세스로 보내는 것과 관련이 있다는 것을 알고 있지만 scp
이로 인해 정리가 실패하는 대신 스크립트가 중단되는 이유를 모르겠습니다.
그래서 내 질문은 다음과 같습니다
- 이로 인해 스크립트가 중단되는 이유는 무엇입니까?
scp
SIGINT가 하위 프로세스 에 도달하는 것을 방지하는 방법은 무엇입니까ssh
?
답변1
trap '' INT
SIGINT는 쉘과 모든 하위 프로세스를 무시하도록 설계되었습니다.
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"