Implement sigterm handler

This avoids situations where the terminal is not reset and still in raw
mode.
This commit is contained in:
Patrick Auernig 2023-08-18 17:05:25 +02:00
parent c9d08421fa
commit 569454dd49
3 changed files with 15 additions and 0 deletions

1
Cargo.lock generated
View File

@ -1074,6 +1074,7 @@ dependencies = [
"lazy_static",
"notify",
"ratatui",
"signal-hook",
"tracing",
"tracing-appender",
"tracing-subscriber",

View File

@ -12,6 +12,7 @@ lazy_static = "1.4"
tracing = "0.1"
tracing-subscriber = "0.3"
tracing-appender = "0.2"
signal-hook = "0.3"
[dependencies.clap]
version = "4.3"

View File

@ -5,7 +5,9 @@ mod view;
use std::io::{self, Stdout};
use std::path::PathBuf;
use std::sync::atomic::{self, AtomicBool};
use std::sync::mpsc::{self, TryRecvError};
use std::sync::Arc;
use anyhow::Result;
use clap::Parser as ArgParser;
@ -98,8 +100,19 @@ pub(crate) fn execute(args: &Args) -> Result<()> {
#[cfg_attr(not(feature = "watch"), allow(unused_mut))]
fn run(terminal: &mut Terminal, mut state: State) -> Result<()> {
let (mut msg_tx, msg_rx) = mpsc::channel::<Message>();
let term_signal_received = Arc::new(AtomicBool::new(false));
signal_hook::flag::register(
signal_hook::consts::SIGTERM,
Arc::clone(&term_signal_received),
)?;
loop {
if term_signal_received.load(atomic::Ordering::Relaxed) {
info!("Received termination signal, exiting");
break;
}
terminal.draw(|frame| {
view::render(&mut state, frame);
})?;