운영자가 중단할 때까지 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
이는 어떤 이유로,했다일하다.