Jak zakończyć sesję Tmux i przetworzyć ją

13

Zauważyłem, że mam uruchomiony proces i myślę, że dzieje się tak, ponieważ zainicjowałem proces w byobu, który używa tmux.

ps aux | grep sidekiq
1000     13786  0.0  0.0   8108   900 pts/4    S+   11:27   0:00 grep sidekiq

Mam sesję tmux o nazwie „3”. Jak widać poniżej:

$ byobu   

Byobu sessions...

  1. tmux: 3: 1 windows (created Wed Aug 28 10:57:54 2013) [229x84] (attached)
  2. tmux: daemon: 1 windows (created Thu Jul 11 12:59:09 2013) [127x83]
  3. tmux: juggernaut: 1 windows (created Thu Jul 11 12:54:08 2013) [80x23]

Chciałbym zakończyć tę sesję i zakończyć wszystkie uruchomione procesy utworzone przez tę sesję.

JohnMerlino
źródło
Czy możesz wkleić dane wyjściowe 'ps -ef | grep byobu 'i' ps -ef | grep tmux '?
Dustin Kirkland

Odpowiedzi:

15
tmux kill-session [-t session_name]

procesy w terminalach wirtualnych powinny otrzymać SIGHUP.

Peter
źródło
6
ale SIGHUP nie zabija procesów. zwykle respanws im.
Andrea Pavoni
1
Zależy od procesów, o których mówisz. Niektóre demony rzeczywiście używają SIGHUP jako sygnału do ponownej inicjalizacji (ponowne odczytanie plików konfiguracyjnych itp.), Ale zwykle odsuwają się one od grupy procesów i terminala sterującego i muszą być odtąd uważane za niezależne. Aplikacje interaktywne zwykle kończą się albo z powodu braku obsługi sygnału, albo z powodu utraty terminala, co jest sprzeczne z interaktywnością.
peterph
6

To mnie również niepokoiło, więc napisałem do tego wtyczkę tmux. Nie jest idealny, ale można go łatwo rozszerzyć, aby wiedzieć, jak bezpiecznie zabijać większość procesów przed wyjściem z tmux: tmux-safekill

Jonathan Lipps
źródło
4

Może nie jest to najbardziej eleganckie rozwiązanie, ale robi to, o co prosiłeś:

tmux list-panes -s -F "#{pane_pid} #{pane_current_command}" | grep -v tmux | awk '{print $1}' | xargs kill -9

Jeśli uruchomisz to z poziomu sesji tmux, zabije on wszystkie procesy, które się pojawił, a następnie możesz zakończyć pracę z tmux exit.

Andrea Schiavini
źródło
1

(zrzeczenie się: jestem początkujący) Ten skrypt kończy wszystkie okna / okna some_sessioni wychodzi:

#!/usr/bin/env bash

session="some_name"

echo about to kill ${session}, ok?
read -n 1 -s -r -p "Press key..."
echo 

sessiontest=`tmux ls | grep ${session}`

if [ "${sessiontest}" == "" ]; 
then
        echo no running session ${session}
else        
        for name in `tmux list-windows -F '#{window_name}' -t ${session}` ; do 

        tmux select-window -n

        for pane in `tmux list-panes -F '#{pane_id}' -t ${session}` ; do 
        tmux send-keys -t $pane C-c
        # send SIGINT to all panes in selected window
        echo ${session}:$name.${pane//%}
        done

        for pane in `tmux list-panes -F '#{pane_pid}' -t ${session}` ; do 
        kill -TERM ${pane}
        # terminate pane
        done

        done 
fi

echo list-sessions:
tmux list-sessions
qrtLs
źródło