@@ -93,27 +93,58 @@ async function main() {
9393 controller . on ( "Exit" , ( args : ExitArgs ) => {
9494 logger . warn (
9595 `控制端命令下线,原因:${ args . reason ?? "无" } ,重连等待时间:${
96- args ?. reconnect ?. delay ?? 0
96+ args ?. reconnect ?. delay ?? "NaN"
9797 } ms`
9898 ) ;
9999 pendingExit = 1 ;
100- exitInterval = setInterval ( ( ) => {
100+ const handler = ( ) => {
101101 const col = stat . collect ( ) ;
102102 if ( col . judge . total === col . judge . finished ) {
103- controller . ws . close ( 1000 , "控制端命令下线" ) ;
104103 controller . exitTimer = setTimeout ( ( ) => {
105104 process . exit ( 0 ) ;
106- } , args ?. reconnect ?. delay ) ;
105+ } , args ?. reconnect ?. delay ?? 200 ) ;
106+ controller . ws . close ( 1000 , "控制端命令下线" ) ;
107107 clearInterval ( exitInterval ) ;
108108 }
109- } , 3000 ) ;
109+ } ;
110+ handler ( ) ;
111+ exitInterval = setInterval ( handler , 3000 ) ;
110112 setTimeout ( ( ) => {
111113 controller . ws . close ( 1000 , "控制端命令下线,但评测任务超时" ) ;
112114 process . exit ( 1 ) ;
113115 } , 300000 ) ;
114116 return Promise . resolve ( null ) ;
115117 } ) ;
116118
119+ const signalHandler = async ( signal : NodeJS . Signals ) => {
120+ const msg = `收到信号 ${ signal } ,准备退出` ;
121+ logger . warn ( msg ) ;
122+ await controller . do ( "Exit" , { reason : msg } ) ;
123+ pendingExit = 1 ;
124+ const handler = ( ) => {
125+ const col = stat . collect ( ) ;
126+ if ( col . judge . total === col . judge . finished ) {
127+ controller . exitTimer = setTimeout ( ( ) => {
128+ process . exit ( 0 ) ;
129+ } , 200 ) ;
130+ controller . ws . close ( 1000 , msg ) ;
131+ clearInterval ( exitInterval ) ;
132+ }
133+ } ;
134+ handler ( ) ;
135+ exitInterval = setInterval ( handler , 3000 ) ;
136+ setTimeout ( ( ) => {
137+ controller . ws . close (
138+ 1000 ,
139+ `收到信号 ${ signal } ,准备退出,但评测任务超时`
140+ ) ;
141+ process . exit ( 2 ) ;
142+ } , 9000 ) ;
143+ } ;
144+
145+ process . on ( "SIGINT" , signalHandler ) ;
146+ process . on ( "SIGTERM" , signalHandler ) ;
147+
117148 controller . on ( "CreateJudge" , ( task ) => {
118149 if ( pendingExit ) {
119150 throw new Error ( "评测机正在等待下线" ) ;
0 commit comments