Skip to content

Instantly share code, notes, and snippets.

@audstanley
Created December 7, 2022 01:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save audstanley/429f95741ee8bae3a604d803d4859e3f to your computer and use it in GitHub Desktop.
Save audstanley/429f95741ee8bae3a604d803d4859e3f to your computer and use it in GitHub Desktop.
my personal little linux screen controller
import os
import re
import subprocess
from time import sleep
class Screen:
def __init__(self):
self.prog = re.compile(r'\s+([-_\w\.]+)')
self.sessions = dict()
self.checkForScreenInstallation()
self.listScreenProcesses()
def checkForScreenInstallation(self):
res = subprocess.run(["/usr/bin/whereis", "screen"], capture_output=True)
screensFound = res.stdout.decode('ascii').split(' ')
if len(screensFound) == 1:
raise Exception("screen is not installed - maybe run: sudo apt install screen -y;")
def screenSendEnterKey(self, screenName: str):
subprocess.run(["/usr/bin/screen", "-S", screenName, "-X", "stuff", '^M'])
def screenSendCommand(self, commandArray: list, screenName: str):
commandStr = ' '.join(commandArray) + '\\015'
print('CMDSTR:', commandStr)
subprocess.run(["/usr/bin/screen", "-S", screenName, "-X", "stuff", commandStr])
def createScreenSession(self, screenName: str):
subprocess.run(["/usr/bin/screen", "-dmS", screenName])
self.listScreenProcesses()
def createScreenSessionWithLogs(self, screenName: str):
# create a logged session
subprocess.run(["/usr/bin/screen", "-dmS", screenName, "-L", "-Logfile", screenName+'.log'])
subprocess.run(["/usr/bin/screen", "-S", screenName, "-X", "colon", '"^A:logfile flush 60^M"'])
self.listScreenProcesses()
def killSubProcessInSession(self, screenName: str):
subprocess.run(["/usr/bin/screen", "-S", screenName, "-X", "stuff", '"^C"'])
def killSession(self, screenName: str):
subprocess.run(["/usr/bin/screen", "-S", screenName, "-X", "stuff", '"^C"'])
subprocess.run(["/usr/bin/screen", "-S", screenName, "-X", "stuff", '"exit\015"'])
self.listScreenProcesses()
def listScreenProcesses(self):
d = dict()
res = subprocess.run(["/usr/bin/screen", "-ls"], capture_output=True)
# convert stdout to an array of strings
lines = res.stdout.decode('ascii').replace('\r','').split('\n')
# remove empty element string from the array
lines = list(filter(None, lines))
# enumerate and match the running screen sessions
for idx, line in enumerate(lines):
if idx != 0 and idx != len(lines)-1 and len(lines) > 2:
## now that we have a least one session line
match = self.prog.match(line)
if match:
# make sure to remove \t after we have a match
sessionNum, sessionName = match[0].replace('\t','').split('.')
d.update({sessionName: sessionNum})
self.sessions = d
def createScreenLogFile(self, screenName: str):
path = os.path.expanduser('~')+"/.screenlogs"
isExist = os.path.exists(path)
if not isExist:
os.makedirs(path)
# this only saves the screen buffer (what is visable in the screen session).
# the file is small, and as long as the sessions isn't pumping a lot of text
# than it can be parsed - if needed.
filename = path+'/'+screenName+'.log'
print(filename)
subprocess.run(["/usr/bin/screen", "-S", screenName, "-X", "stuff", '"^A:bufferfile '+filename+'\\015"'])
s = Screen()
# s.createScreenSessionWithLogs('test')
# s.screenSendCommand(['ls', '-la'], 'test')
# s.screenSendEnterKey('test')
# s.screenSendEnterKey('test')
# s.screenSendEnterKey('test')
# s.createScreenLogFile('test')
# print(s.sessions)
#s.killSession('test')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment