CTRL-C가 한 사용자 계정에서는 작동하지만 다른 사용자 계정에서는 작동하지 않는 이유는 무엇입니까?

CTRL-C가 한 사용자 계정에서는 작동하지만 다른 사용자 계정에서는 작동하지 않는 이유는 무엇입니까?

운영자가 중단할 때까지 X초마다 명령을 실행하도록 되어 있는 bash 스크립트가 있습니다. 이와 같이:

테스트 파일

#!/bin/bash

while true; do
    echo Doing a thing...
    sleep 3 & wait
done

대부분의 경우 이는 예상대로 작동합니다. 그러나 특정 사용자 계정(물론 내 계정) 내에서는생각하다이것은 CTRL-C스크립트에 인터럽트 신호를 보내지 않는 것 같은 키 조합입니다. 즉, 다른 터미널에서 종료할 때까지 영원히 실행됩니다.

두번째로 좋은.

내가 가장 먼저 확인한 것은 계정의 .profile에 정의되지 않은 stty intr이 있었지만 그렇지 않았는지(그리고 명시적으로 다음 행을 추가했는지)였습니다.

stty intr "^c"

내 스크립트에 도움이 되지 않았고 이스케이프 코드를 다른 것으로 설정하지도 않았습니다. .profile어디에서도 신호가 잡히지 않는 것 같습니다 . 이 문제는 sudo를 사용하여 계정을 입력하거나 직접 로그인하면 발생합니다. CTRL-C명령줄에서 다른 명령(예: ping)을 실행하면 예상대로 작동하는 것 같습니다.

CTRL-C스크립트를 루트로 실행하거나 권한이 없는 다른 계정으로 로그인하면 스크립트가 예상대로 중단됩니다. 기본 .profile을 사용하여 권한이 없는 새로운 계정을 생성하면 작동하지 않습니다. 이는 모두 동일한 터미널 설치 및 설정(PuTTY)을 사용하므로 터미널 자체가 어떤 방식으로든 신호를 가로채거나 손상시키는 경우는 아닌 것으로 보입니다.

내가 생각할 수 있는 유일한 것은 이것이 동작에 영향을 미치는 일부 프로필 설정이라는 것입니다. 하지만 .profile에는 아무것도 표시되지 않으며 아마도 stty.profile 외부 $TERM(모든 계정에서 동일함)에는 아무것도 표시되지 않습니다. 그것 밖에 이렇게 영향을 미칠 수 있는 모든 것.

(지금은 내 .profile을 포함하지 않습니다. 왜냐하면 솔직히 그 프로필은 엉망이고 정리하는 데 시간이 걸리기 때문입니다. 내 프로필에 무엇이 문제인지 찾는 데는 그다지 관심이 없습니다. .profile(s), 특히 새로운 이후로 계정의 기본 .profile에도 이 문제가 있으며 해결 방법을 찾아야 하는 위치에 대한 자세한 정보가 있습니다.

관련이 있는 경우를 대비해 내 stty -a 설정은 다음과 같습니다(직장 및 비직장 계정에서 동일함).

speed 38400 baud;
rows = 25; columns = 80; ypixels = 0; xpixels = 0;
intr = ^c; quit = <undef>; erase = ^h; kill = ^x;
eof = ^d; eol = <undef>; eol2 = <undef>; swtch = <undef>;
start = ^q; stop = ^s; susp = ^z; dsusp = <undef>;
rprnt = ^r; flush = ^o; werase = ^w; lnext = ^v;
-parenb -parodd -parext cs8 -cstopb hupcl cread -clocal -loblk
-ignbrk brkint -inpck -ignpar -parmrk -istrip -inlcr -igncr icrnl -iuclc
ixon -ixany ixoff -imaxbel
opost -olcuc onlcr -ocrnl -onocr -onlret -ofill -ofdel tab3
isig icanon -xcase echo echoe echok -echonl -noflsh
-tostop -echoctl -echoprt -echoke -defecho -flusho -pendin -iexten
-isscancode -xscancode

내가 무엇을 놓치고 있나요? 중요한 경우 SCO OpenServer 6.0.0 MP4에서 GNU bash 3.2.17(1) 릴리스를 실행하고 있습니다.


시도된 다른 것들(댓글 스레드에서 제외하기 위해 여기에 문서화됨)

  • 스크립트가 실행되는 동안 다른 터미널에서 다음 명령을 실행합니다.

    kill -INT <process>
    

    루트로 kill 명령을 실행해도 아무 것도 수행되지 않습니다. 달리기

    kill -HUP <process>
    

    예상대로 스크립트를 종료합니다.

  • 스크립트에 다음 줄을 추가하여 신호를 포착해 보았습니다.

    trap "echo hi" SIGINT
    trap "echo lo" SIGHUP
    

    CTRL-C위에서 언급한 것처럼 때리거나 달릴 때는 kill -INT <process>아무 일도 일어나지 않습니다 . 위와 같이 실행하면 kill -HUP <process>예상대로 "lo"가 에코됩니다.

  • 나는 다음을 통해 스크립트를 실행하려고합니다.

    /bin/sh /path/to/test.sh
    /bin/bash /path/to/test.sh
    /path/to/test.sh
    cd /path/to; test.sh
    

    다르지 않습니다.

  • @mosvy가 의견에서 제안한 대로 다음과 같이 Perl을 통해 실행해 보았습니다.

    perl -e '$SIG{INT}="DEFAULT"; exec @ARGV or die "exec: $!"' /path/to/test.sh
    

    이는 어떤 이유로,했다일하다.

관련 정보