Is there any algorithm to restart a program?


#1

I want to have a functionality of restarting my rust program.
For an abstract example, imagine a user who write “restart” in the irc chat, some bot reads it and restarts itself. How can I do that in rust?


#2

I usually do this with a script. The program returns a special exit code that the scripts detects and restarts the application as opposed to exiting.


#3

Well, if you don’t have any mutable global state, you could just write:

fn main() {
  while run() {}
}
fn run() -> bool {
  // ... return true to restart, false to exit.
}

Alternatively, if you only care about supporting Linux (I mean, who cares about other OSs :smile:) , you can just exec /proc/self/exe:

fn restart() {
    use std::os::unix::process::CommandExt;
    Command::new("/proc/self/exe").exec().expect("failed to restart process");
}

#4

Your solutions are very nice! :))
And also, we may add arguments to /proc/self/exe by arguments from /proc/self/cmdline!


#5

This requires something like supervisord but I dont really want that. But thanks for posting, I’ll keep this in mind, there is a probability in near future that I can change my mind and use supervisord.


#6

As an alternative, if you are using systemd, you can write a simple unit file:

[Unit]
Description=myprogram

[Service]
User=myuser
Group=mygroup
Restart=on-failure
ExecStart=/path/to/myprogram

[Install]
WantedBy=multi-user.target

HTH,