My research often has a computational component which means logging into one of my servers, kicking off a long running computation, waiting a few days and recovering the output. Here’s how I, inspired by Filippo Valsorda’s post, addressed some of the pain points with this sort thing.
To keep jobs running when logging off, I – like most people these days – use tmux. Here’s my
new-session # shell set -g default-command /bin/zsh set -g default-shell /bin/zsh # source config file bind r source-file ~/.tmux.conf # history set -g history-limit 20000 bind-key P command-prompt -p 'save history to filename:' -I '~/tmux.history' 'capture-pane -S -32768 ; save-buffer %1 ; delete-buffer'
The key line for what’s to follow is
tmux will automatically create a new session if there isn’t one already when calling
To talk to the hosts, I – again, like many people these days – use mosh which handles connection drops gracefully. Thus, switching WiFi networks doesn’t mean my SSH session dies.
Combining the two above, I can call:
mosh $HOSTNAME -- tmux a
$HOSTNAME and calls
tmux a there. Since this is too much type I have a shell script
##!/usr/bin/env bash mosh $1 -- tmux a
which I call
motu. To make this behave as well as
ssh in terms of tab completion, my
which instructs ZSH to use completions from
motu. Now, typing
motu strombenzin logs me into my server
strombenzin with either a
tmux session being created or with being dropped into the previous one. To “log out” I do
Ctrl-b d, i.e. I simply detach the tmux session.
Finally, being an emacs users, I create a bunch of emacs commands to do the same from within emacs
(dolist (server-name '("strombenzin" … …)) (fset (intern (format "mosh/%s" server-name)) (malb/make-toggle-shell (format "*mosh:%s*" server-name) `(progn (let ((vterm-shell (format "mosh %s -- tmux a" ,server-name))) (vterm (format "*mosh:%s*" server-name)))))))
which creates commands such as
malb/make-toggle-shell is from my emacs configuration).