I'm using Ubuntu 18.04 (for both my local machine and my server) and the terminal freezes when I come back to an open SSH session after leaving it alone for a while.

I have to close the terminal window and SSH back into the server to get access again. It's becoming quite annoying.

If the SSH session is displaying a stream of new information, like a log that prints new info every couple of seconds, then it will not freeze. The terminal only freezes if nothing has been printed to the screen for a while.

How can I stay logged into an SSH session without this happening?


1 Answer 1


I use the following to keep an SSH session alive:

# Name: /usr/bin/bigben         Author: Joe Smith 
# Purpose: Outputs time, uptime, or message every N minutes to keep session up.
# Automatically terminates when STDIN is no longer connected to a terminal.

use strict; use warnings;
$| = 1;

my $period = 10;        # Default minutes between outputs
@ARGV and $ARGV[0] =~ /^-(\d+)$/ and $period = 0-shift; # "-60" for 60 minutes

(@ARGV and $period) or die <<EOM;
Usage: bigben "Hello, World!" & # Output text & time every $period minutes
       bigben -d &              # Output date & time every $period minutes
       bigben -q &              # Output a null byte every $period minutes
       bigben -u &              # Output  `uptime`   every $period minutes
       bigben -15 -d &      # Output date & time every 15 minutes
Also outputs `date` at startup and at midnight.
Program automatically terminates upon logout or network disconnection.

my $string = "@ARGV";
my $today  = 'first time';

# Sleep 1 second to start; continue while -t() is true; wake once a minute
for (sleep 1; -t(); sleep 60 - (time % 60)) {   # Stop when /dev/tty disappears

  next unless $today eq 'first time' or ((time/60) % $period) == 0;

  my ($sec,$minutes,$hours,$day,$mon,$year,$weekdaynum) = localtime;
  my $yyyymmdd = sprintf "%04d-%02d-%02d", $year+1900, $mon+1, $day;
  my $hhmmss   = sprintf "%02d:%02d:%02d", $hours, $minutes, $sec;
  my $weekday = (qw(Sun Mon Tue Wed Thu Fri Sat))[$weekdaynum];

  system 'date' unless $today eq $weekday;  # First time or at midnight

  if      ($string eq '-d') {           # Output date & time
    printf "\r\t\t\t\t  %s %s  \r\n", $yyyymmdd, $hhmmss;

  } elsif ($string eq '-q' or $string eq '-n' or $string eq '-0') {
    print "\0";                 # Quiet: output a null byte

  } elsif ($string eq '-u') {
    $_ = `uptime`; s/\s+/ /g;           # Get uptime and squeeze it
    s/^/$weekday/; s/ day(s?), /day$1_/;
    s/_(\d) min/_00:0$1/; s/_(\d\d) min/_00:$1/; s/_(\d):/_0$1:/;
    s/load average: (\S+) (\S+) (\S+)/LA:$1$2$3/;
    print  "\r\t\t  $_\r\n";            # Output modified uptime

  } else {                  # Output "string HH:MM"
    printf "\r\t\t\t\t  %s  %s %02d:%02d  %s\r\n",
        ($minutes == 0 ? $yyyymmdd : '');
  $today = $weekday;

I have my .login file run "bigben -u &" on certain hosts when it detects an SSH session.

The alternative is "ssh -o TCPKeepAlive remotehost" to keep the NAT translation active.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.