diff --git a/.changeset/sigterm-graceful-shutdown.md b/.changeset/sigterm-graceful-shutdown.md
new file mode 100644
index 00000000..e98bce63
--- /dev/null
+++ b/.changeset/sigterm-graceful-shutdown.md
@@ -0,0 +1,8 @@
+---
+"googleworkspace-cli": patch
+---
+
+Handle SIGTERM in `gws gmail +watch` and `gws events +subscribe` for clean shutdown.
+
+Long-running pull loops now exit gracefully on SIGTERM (in addition to Ctrl+C),
+enabling clean shutdown in containers and process supervisors.
diff --git a/Cargo.lock b/Cargo.lock
index 10e12097..7122d964 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -914,6 +914,7 @@ dependencies = [
"hostname",
"iana-time-zone",
"keyring",
+ "libc",
"mail-builder",
"mime_guess2",
"percent-encoding",
diff --git a/Cargo.toml b/Cargo.toml
index 1f73b8f7..fbd98448 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -84,4 +84,5 @@ inherits = "release"
lto = "thin"
[dev-dependencies]
+libc = "0.2"
serial_test = "3.4.0"
diff --git a/src/helpers/events/subscribe.rs b/src/helpers/events/subscribe.rs
index 00474ac7..3b22eeaf 100644
--- a/src/helpers/events/subscribe.rs
+++ b/src/helpers/events/subscribe.rs
@@ -320,6 +320,14 @@ async fn pull_loop(
pubsub_api_base: &str,
) -> Result<(), GwsError> {
let mut file_counter: u64 = 0;
+
+ #[cfg(unix)]
+ let mut sigterm = tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate())
+ .context("failed to register SIGTERM handler")?;
+ #[cfg(unix)]
+ let mut sigint = tokio::signal::unix::signal(tokio::signal::unix::SignalKind::interrupt())
+ .context("failed to register SIGINT handler")?;
+
loop {
let token = token_provider
.access_token()
@@ -337,6 +345,16 @@ async fn pull_loop(
.timeout(std::time::Duration::from_secs(config.poll_interval.max(10)))
.send();
+ // Hoist signal futures outside select! — #[cfg] is not supported inside
+ // tokio::select! branches; cfg'd let bindings are the workaround.
+ #[cfg(unix)]
+ hoist_signals!(sigint, sigterm, sigint_fut, sigterm_fut);
+ #[cfg(not(unix))]
+ let (sigint_fut, sigterm_fut) = (
+ tokio::signal::ctrl_c(),
+ std::future::pending::