2014-12-01 4 views
0

나는 외부 소스에 의해 관리되고 이상적으로는 수정되어서는 안되는 bash 스크립트 server.sh를 가지고있다. 이 스크립트는 stdout 및 stderr에 기록합니다.Tcl과 Cygwin과 백그라운드 프로세스가 끊어 질 것임

는 사실이 server.sh 자체는 즉시 간부 tclsh을하고있다 :

#!/bin/sh 
# \ 
exec tclsh "$0" ${1+"[email protected]"} 

그래서 사실, 그것은 Tcl의 스크립트 주변 단지 래퍼입니다. 나는이 문제가 중요하다고 생각할 때를 대비하여 언급합니다.

몇 가지 준비 작업을 수행해야하는 Tcl 스크립트 setup.tcl이 필요합니다. 백그라운드에서 server.sh를 호출 한 다음 정리 작업을 수행하고 백그라운드 프로세스의 PID를 표시합니다. .

server.sh는 명시 적으로 종료 될 때까지 계속 실행되어야합니다.

setup.tcl은 일반적으로 Cygwin bash 셸 또는 Windows cmd 셸에서 수동으로 호출됩니다. 후자의 경우 Cygwin의 bash.exe가 PATH에 있음을 보장합니다.

환경은 Windows 7 및 Cygwin입니다. Tcl은 Cygwin (8.5) 또는 ActiveState 8.4입니다.

첫 번째 버전 (생략 오류 처리)과 같이 갔다 :

# setup.tcl: 
# .... preparatory work goes here 
set childpid [exec bash.exe server.sh &] 
# .... clean up work goes here 
puts $childpid 
exit 0 

윈도우 CMD 쉘에서 ActiveState의 티클로 시작했을 때이 작동하지만, 그것은 순수한 Cygwin에서 설정에서 작동하지 않습니다. 그 이유는 setup.tcl이 끝나자 마자 신호가 자식 프로세스로 보내지기 때문에이 역시 죽습니다.

nohup을 사용하면 server.sh의 출력을 즉시 확인하고 싶기 때문에 여기서는 도움이되지 않습니다.

#!/usr/bin/bash 
# mediator.sh 
server.sh & 
child=$! 
disown -h $child 

과에서 mediator.sh를 호출 :

나의 다음 생각은 자식 프로세스를 분리 살해되는 것을 계속 부인 -h 사용하여 만든 중간 bash는 스크립트, mediator.sh,하는 것입니다 setup.tcl. 그러나 setup.tcl에 자식 PID를 전달하는 쉬운 방법이 없다는 것을 제외하고는 주된 문제는 그것이 작동하지 않는다는 것입니다. mediator.sh가 실제로 자식을 호출 할 때 살아있는 동안 Cygwin 명령 줄에서 직접 setup.tcl을 통해 호출 할 때 setup.cl이 종료 될 때 server.sh가 다시 실행되는 것과 같은 동작이 다시 발생합니다.

누구든지 해결책을 알고 계십니까?

답변

1

서버 스크립트에 trap 처리기를 설정하여 특정 신호를 처리하거나 무시할 수 있습니다.

예를 들어

, 당신은 다음과 같은 것을 할 수있는, HUP 신호를 무시 : 예제 경우

#!/bin/bash 

handle_signal() { 
    echo "Ignoring HUP signal" 
} 

trap handle_signal SIGHUP 

# Rest of code goes here 

를, 스크립트가받는 경우 HUP는 메시지를 출력하고 정상적으로 계속 신호. 아직 처리되지 않은 INT 신호이므로 Ctrl-C로 죽을 것입니다.

+0

실제로 나는 server.tcl의 코드를 "소유"하지 않기 때문에 중재자 스크립트에 함정을 넣어야 할 것입니다. 그러나 이것은 실제로 작동 할 수 있습니다! – user1934428

+0

나는 방금 확인했다 : 그것은 효과가있다! – user1934428

관련 문제