@@ -73,16 +73,14 @@ enum ProcessConfigEnum {
7373}
7474
7575pub struct Manager {
76- program : String ,
7776 args : ManagerArgs ,
7877 cmds : Arc < Mutex < HashMap < ProcessConfigEnum , Cmd > > > ,
7978 configs : Arc < Mutex < Option < Vec < ProcessConfigEnum > > > > ,
8079}
8180
8281impl Manager {
83- pub fn new ( program : String , args : ManagerArgs ) -> Self {
82+ pub fn new ( args : ManagerArgs ) -> Self {
8483 Self {
85- program,
8684 args,
8785 cmds : Arc :: new ( Mutex :: new ( HashMap :: new ( ) ) ) ,
8886 configs : Arc :: new ( Mutex :: new ( None ) ) ,
@@ -184,12 +182,11 @@ impl Manager {
184182 }
185183
186184 fn sync_run (
187- program : String ,
188185 cmd_map : Arc < Mutex < HashMap < ProcessConfigEnum , Cmd > > > ,
189186 configs : Vec < ProcessConfigEnum > ,
190187 sub_cmd : & ' static str ,
191188 ) -> BoxFuture < ' static , Result < ( ) > > {
192- async move { Self :: run ( program , cmd_map, configs, sub_cmd) . await } . boxed ( )
189+ async move { Self :: run ( cmd_map, configs, sub_cmd) . await } . boxed ( )
193190 }
194191
195192 async fn handle_stdout (
@@ -265,7 +262,6 @@ impl Manager {
265262 }
266263
267264 async fn run (
268- program : String ,
269265 cmd_map : Arc < Mutex < HashMap < ProcessConfigEnum , Cmd > > > ,
270266 configs : Vec < ProcessConfigEnum > ,
271267 sub_cmd : & ' static str ,
@@ -295,7 +291,7 @@ impl Manager {
295291 . into_iter ( )
296292 . map ( |config| {
297293 info ! ( "run {sub_cmd} config: {:?}" , config) ;
298- let mut cmd = Command :: new ( program . clone ( ) ) ;
294+ let mut cmd = Command :: new ( env :: current_exe ( ) ? ) ;
299295 cmd. arg ( sub_cmd) ;
300296 cmd_config ! ( cmd, config) ;
301297 cmd. spawn ( )
@@ -306,7 +302,6 @@ impl Manager {
306302 let ready_done_counter = Arc :: new ( AtomicUsize :: new ( cmds. len ( ) ) ) ;
307303
308304 for ( mut c, config) in cmds {
309- let program = program. clone ( ) ;
310305 let cmd_map = cmd_map. clone ( ) ;
311306 let ready_done_counter = ready_done_counter. clone ( ) ;
312307 tokio:: spawn ( async move {
@@ -327,11 +322,10 @@ impl Manager {
327322 process_shutdown ( config. clone ( ) , cmd, send_graceful_shutdown) . await ;
328323 }
329324 let reconnect = async {
330- let program = program. clone ( ) ;
331325 let cmds = cmd_map. clone ( ) ;
332326 let config = config. clone ( ) ;
333327 if let Err ( e) =
334- Self :: sync_run ( program , cmds, vec ! [ config. clone( ) ] , sub_cmd) . await
328+ Self :: sync_run ( cmds, vec ! [ config. clone( ) ] , sub_cmd) . await
335329 {
336330 error ! ( "{sub_cmd} ({config:?}) reconnect sync_run failed: {:?}" , e) ;
337331 }
@@ -387,7 +381,15 @@ impl Manager {
387381 loop {
388382 info ! ( "restarting {sub_cmd} ({config:?}) in {wait_time:?}" ) ;
389383 tokio:: time:: sleep ( wait_time) . await ;
390- let mut cmd = Command :: new ( & program) ;
384+ let exe = match env:: current_exe ( ) {
385+ Ok ( exe) => exe,
386+ Err ( e) => {
387+ wait_time = Duration :: from_secs ( 3 * 60 ) ;
388+ error ! ( "failed to restart {sub_cmd} ({config:?}): {:?}" , e) ;
389+ continue ;
390+ }
391+ } ;
392+ let mut cmd = Command :: new ( exe) ;
391393 cmd. arg ( sub_cmd) ;
392394 cmd_config ! ( cmd, config) ;
393395 match cmd. spawn ( ) {
@@ -426,7 +428,6 @@ impl Manager {
426428 }
427429 if !server_config. is_empty ( ) {
428430 Self :: run (
429- self . program . clone ( ) ,
430431 self . cmds . clone ( ) ,
431432 server_config,
432433 "sub-server" ,
@@ -437,7 +438,6 @@ impl Manager {
437438
438439 if !client_config. is_empty ( ) {
439440 Self :: run (
440- self . program . clone ( ) ,
441441 self . cmds . clone ( ) ,
442442 client_config,
443443 "sub-client" ,
0 commit comments