일시 중지되었을 때 스크립트가 무언가를 에코하도록 하려면 어떻게 해야 합니까?

일시 중지되었을 때 스크립트가 무언가를 에코하도록 하려면 어떻게 해야 합니까?

일시 중지 터미널 스크립트를 사용하고 SIGSTOP있으며 일시 중지 중임을 나타내는 메시지를 인쇄하고 싶습니다.

  • 트랩을 할 수 없어서 before를 보내고 잡아보려고 SIGSTOP했는데 트랩에 넣은 명령은 결국 스크립트가 재개된 후에 실행됩니다.SIGUSR1SIGSTOP
  • 와 사이에 넣으면 sleep트랩 명령이 실행되지만 스크립트는 수신되기 전에 잠시 동안 실행됩니다.SIGUSR1SIGSTOPSIGSTOP

외부에서 스크립트에 "일시 중지 중입니다"라고 에코하도록 지시할 수 있는 방법이 있나요?멈추다?

편집 : 나는 bash를 사용하고 있습니다. 내 테스트 스크립트는 다음과 같습니다.

trap "echo Paused" SIGUSR1
trap "echo Restarted" SIGCONT

while : ; do
    echo `date`
    sleep 1
done

나는 그것을 "./blah.sh"라고 부릅니다.

내 제어 스크립트는 다음과 같습니다

script_id=`pidof -x blah.sh`
kill -SIGUSR1 $script_id
sleep 0.5
kill -SIGSTOP $script_id

sleep 2

script_id=`pidof -x blah.sh`
kill -SIGCONT $script_id

답변1

.see SIGTSTP대신 사용해야 합니다 .SIGSTOP여기:

SIGSTOP신호는 프로세스를 중지합니다.무시할 수도, 무시할 수도 없습니다. 또는 차단되었습니다.

SIGTSTP신호는 대화형 정지 신호입니다.SIGSTOP이것 과는 달라 신호를 처리하고 무시할 수 있습니다.

예는 다음과 같습니다.

paused() {
    echo PAUSED
    kill -SIGSTOP $$ # This signal cannot be handled. Here the script is actually paused.
    echo CONTINUED
}
trap 'paused' SIGTSTP

예:

$ ./test_pause.sh & disown
[1] 18852
$ kill -TSTP 18852
PAUSED
$ kill -CONT 18852
CONTINUED

관련 정보