@@ -188,9 +188,27 @@ private void LaunchDevelopmentProxy()
188
188
WorkingDirectory = Path . Combine ( AppContext . BaseDirectory , _options . WorkingDirectory )
189
189
} ;
190
190
_spaProcess = Process . Start ( info ) ;
191
- if ( OperatingSystem . IsWindows ( ) && _spaProcess != null )
191
+ if ( _spaProcess != null && ! _spaProcess . HasExited )
192
192
{
193
- var stopScript = $@ "do{{
193
+ if ( OperatingSystem . IsWindows ( ) )
194
+ {
195
+ LaunchStopScriptWindows ( _spaProcess . Id ) ;
196
+ }
197
+ else if ( OperatingSystem . IsMacOS ( ) )
198
+ {
199
+ LaunchStopScriptMacOS ( _spaProcess . Id ) ;
200
+ }
201
+ }
202
+ }
203
+ catch ( Exception exception )
204
+ {
205
+ _logger . LogError ( exception , $ "Failed to launch the SPA development server '{ _options . LaunchCommand } '.") ;
206
+ }
207
+ }
208
+
209
+ private void LaunchStopScriptWindows ( int spaProcessId )
210
+ {
211
+ var stopScript = $@ "do{{
194
212
try
195
213
{{
196
214
$processId = Get-Process -PID { Environment . ProcessId } -ErrorAction Stop;
@@ -203,35 +221,81 @@ private void LaunchDevelopmentProxy()
203
221
204
222
try
205
223
{{
206
- taskkill /T /F /PID { _spaProcess . Id } ;
224
+ taskkill /T /F /PID { spaProcessId } ;
207
225
}}
208
226
catch
209
227
{{
210
228
}}" ;
211
- var stopScriptInfo = new ProcessStartInfo (
212
- "powershell.exe" ,
213
- string . Join ( " " , "-NoProfile" , "-C" , stopScript ) )
214
- {
215
- CreateNoWindow = true ,
216
- WorkingDirectory = Path . Combine ( AppContext . BaseDirectory , _options . WorkingDirectory )
217
- } ;
229
+ var stopScriptInfo = new ProcessStartInfo (
230
+ "powershell.exe" ,
231
+ string . Join ( " " , "-NoProfile" , "-C" , stopScript ) )
232
+ {
233
+ CreateNoWindow = true ,
234
+ WorkingDirectory = Path . Combine ( AppContext . BaseDirectory , _options . WorkingDirectory )
235
+ } ;
218
236
219
- var stopProcess = Process . Start ( stopScriptInfo ) ;
220
- if ( stopProcess == null || stopProcess . HasExited )
221
- {
222
- _logger . LogWarning ( $ "SPA process shutdown script '{ stopProcess ? . Id } ' failed to start. The SPA proxy might" +
223
- $ " remain open if the dotnet process is terminated abruptly. Use the operating system command to kill" +
224
- $ "the process tree for { _spaProcess . Id } ") ;
225
- }
226
- else
227
- {
228
- _logger . LogDebug ( $ "Watch process '{ stopProcess } ' started.") ;
229
- }
230
- }
237
+ var stopProcess = Process . Start ( stopScriptInfo ) ;
238
+ if ( stopProcess == null || stopProcess . HasExited )
239
+ {
240
+ _logger . LogWarning ( $ "The SPA process shutdown script '{ stopProcess ? . Id } ' failed to start. The SPA proxy might" +
241
+ $ " remain open if the dotnet process is terminated ungracefully. Use the operating system commands to kill" +
242
+ $ " the process tree for { spaProcessId } ") ;
231
243
}
232
- catch ( Exception exception )
244
+ else
233
245
{
234
- _logger . LogError ( exception , $ "Failed to launch the SPA development server '{ _options . LaunchCommand } '.") ;
246
+ _logger . LogDebug ( $ "Watch process '{ stopProcess } ' started.") ;
247
+ }
248
+ }
249
+
250
+ private void LaunchStopScriptMacOS ( int spaProcessId )
251
+ {
252
+ var fileName = Guid . NewGuid ( ) . ToString ( "N" ) + ".sh" ;
253
+ var scriptPath = Path . Combine ( AppContext . BaseDirectory , fileName ) ;
254
+ var stopScript = @$ "function list_child_processes(){{
255
+ local ppid=$1;
256
+ local current_children=$(pgrep -P $ppid);
257
+ local local_child;
258
+ if [ $? -eq 0 ];
259
+ then
260
+ for current_child in $current_children
261
+ do
262
+ local_child=$current_child;
263
+ list_child_processes $local_child;
264
+ echo $local_child;
265
+ done;
266
+ else
267
+ return 0;
268
+ fi;
269
+ }}
270
+
271
+ ps { Environment . ProcessId } ;
272
+ while [ $? -eq 0 ];
273
+ do
274
+ sleep 1;
275
+ ps { Environment . ProcessId } > /dev/null;
276
+ done;
277
+
278
+ for child in $(list_child_processes { spaProcessId } );
279
+ do
280
+ echo killing $child;
281
+ kill -s KILL $child;
282
+ done;
283
+ rm { scriptPath } ;
284
+ " ;
285
+ File . WriteAllText ( scriptPath , stopScript ) ;
286
+
287
+ var stopScriptInfo = new ProcessStartInfo ( "/bin/bash" , scriptPath )
288
+ {
289
+ CreateNoWindow = true ,
290
+ WorkingDirectory = Path . Combine ( AppContext . BaseDirectory , _options . WorkingDirectory )
291
+ } ;
292
+
293
+ var stopProcess = Process . Start ( stopScriptInfo ) ;
294
+ if ( stopProcess == null || stopProcess . HasExited )
295
+ {
296
+ _logger . LogWarning ( $ "The SPA process shutdown script '{ stopProcess ? . Id } ' failed to start. The SPA proxy might" +
297
+ $ " remain open if the dotnet process is terminated ungracefully. Use the operating system commands to kill" +
298
+ $ " the process tree for { spaProcessId } ") ;
235
299
}
236
300
}
237
301
0 commit comments