diff --git a/src/bin/proxmox-backup-api.rs b/src/bin/proxmox-backup-api.rs index 7d59717b..70d4cb5d 100644 --- a/src/bin/proxmox-backup-api.rs +++ b/src/bin/proxmox-backup-api.rs @@ -76,6 +76,7 @@ async fn run() -> Result<(), Error> { }) ) }, + "proxmox-backup.service", ); server::write_pid(buildcfg::PROXMOX_BACKUP_API_PID_FN)?; diff --git a/src/bin/proxmox-backup-proxy.rs b/src/bin/proxmox-backup-proxy.rs index 04c976b5..259d558a 100644 --- a/src/bin/proxmox-backup-proxy.rs +++ b/src/bin/proxmox-backup-proxy.rs @@ -133,6 +133,7 @@ async fn run() -> Result<(), Error> { .map(|_| ()) ) }, + "proxmox-backup-proxy.service", ); server::write_pid(buildcfg::PROXMOX_BACKUP_PROXY_PID_FN)?; diff --git a/src/tools/daemon.rs b/src/tools/daemon.rs index 249ce2ad..63eb6dee 100644 --- a/src/tools/daemon.rs +++ b/src/tools/daemon.rs @@ -260,6 +260,7 @@ impl Future for NotifyReady { pub async fn create_daemon( address: std::net::SocketAddr, create_service: F, + service_name: &str, ) -> Result<(), Error> where F: FnOnce(tokio::net::TcpListener, NotifyReady) -> Result, @@ -301,10 +302,35 @@ where if let Some(future) = finish_future { future.await; } + + // FIXME: this is a hack, replace with sd_notify_barrier when available + if server::is_reload_request() { + check_service_is_active(service_name).await?; + } + log::info!("daemon shut down..."); Ok(()) } +pub async fn check_service_is_active(service: &str) -> Result<(), Error> { + for _ in 0..5 { + tokio::time::delay_for(std::time::Duration::new(5, 0)).await; + if let Ok(output) = tokio::process::Command::new("systemctl") + .args(&["is-active", service]) + .output() + .await + { + if let Ok(text) = String::from_utf8(output.stdout) { + if text.trim().trim_start() != "reloading" { + return Ok(()); + } + } + } + } + + Ok(()) +} + #[link(name = "systemd")] extern "C" { fn sd_notify(unset_environment: c_int, state: *const c_char) -> c_int;