2014-01-23 3 views
1

자주 변경 사항이 적용되는지 확인하기 위해 서버를 다시 실행해야합니다. 이 서버를 셸에서 열어두면 현재 로그에 빠르게 액세스 할 수 있습니다. 그래서 여기에 쉘에 입력 한 내용이 있습니다 : ^C!!⏎. 그 값은 send SIGINT이고, 그 다음은 relaunch last event in history입니다.현재 포 그라운드 프로세스를 중지하고 다시 실행 하시겠습니까?

그래서 내가 입력하고 싶은 것은 ^R이며 같은 결과를 얻습니다.

는 (참고 : 나는 zsh을 사용) :

relaunch-function() { 
     kill -INT %% && !! 
} 
zle -N relaunch-widget relaunch-function 
bindkey "^R" relaunch-widget 

하지만 내 서버를 실행하는 동안,^R은 쉘 그래도 그러나 서버로 전달되지 않을 것으로 보인다

나는 다음과 같은 시도 그것은 쉘을 알아 채지 못한다. 그래서 리턴 값과 프로세스 이름을 테스트하는 것이 가능해야하는 반면, 제네릭 솔루션을 볼 수 없습니다.

답변

1

작업이 포 그라운드에서 실행중인 동안에는 키가 셸로 전달되지 않습니다. 따라서 포 그라운드 프로세스를 종료하고 다시 시작하는 키 바인딩을 설정하면 작동하지 않습니다.

그러나 무한 루프로 서버를 시작할 수 있으므로 서버가 자동으로 다시 시작됩니다. 명령의 이름을 가정하면 쉘에 다음과 같이 시작할 수 있습니다 run_server입니다 :

(TRAPINT(){};while sleep .5; do run_server; done) 

주변 괄호는 서브 쉘, TRAPINT(){}이 쉘 SIGINT을 비활성화 시작합니다. while 루프는 종료 상태가 0이 아닌 sleep이 종료 될 때까지 run_server을 계속 다시 시작합니다. 이는 sleep^C으로 방해함으로써 달성 될 수 있습니다. (TRAPINT을 설정하지 않으면 run_server을 중단해도 루프가 중단 될 수 있습니다.)

따라서 서버를 다시 시작하려면 ^C을 누르고 0.5 초 동안 기다리십시오. 다시 시작하지 않고 서버를 중지하려면 ^C을 0.5 초 안에 두 번 누릅니다.

는 해당하는 기능을 만들 수 있습니다 입력 일부를 저장하려면 :

doloop() {(
    TRAPINT(){} 
    while sleep .5 
    do 
     echo running \"[email protected]\" 
     eval [email protected] 
    done 
)} 

다음 doloop run_server로 부른다. 참고 : 함수는 자체적으로 하위 셸을 열지 않으므로 추가 주변에 ()이 필요합니다.

eval은 쉘 구조가 사용될 수있게합니다. 예 : doloop LANG=C locale. 어떤 경우에는 (싱글)을 사용해야 할 수도 있습니다 :

$ doloop echo $RANDOM 
running "echo 242" 
242 
running "echo 242" 
242 
running "echo 242" 
242 
^C 
$ doloop 'echo $RANDOM' 
running "echo $RANDOM" 
10988 
running "echo $RANDOM" 
27551 
running "echo $RANDOM" 
8910 
^C 
+0

대단히 감사합니다. 지금 나는 약간의 문제를 만났습니다.'LANG = C/run_server'는 작동하지 않고'doloop : 5 : command not found : LANG = C'를주었습니다. 나는 내 로컬에서 대부분 괜찮 으면 좋겠지 만, 여기에서는 orignal 로그에 액세스하려고합니다. 번역은 디버그에 도움이되지 않습니다. – psychoslave

+0

즉, 단일'$ @ '가있는 행이 쉘에 의해 평가되지 않기 때문입니다. 나는'eval $ @'을 사용하도록 스크립트를 업데이트했다. – Adaephon

+0

감사합니다. 필자는'tput setaf 6'과'tput setaf 7'을 사용하여 에코를 싸서 다시 시작한 곳을 쉽게 볼 수 있습니다. – psychoslave

관련 문제