屏幕获取状态或附加和分离在一行

时间:2014-10-21 15:16:44

标签: unix gnu-screen

我与screen同时运行了很多独立程序。这些程序输出(cout C ++)中的每一个都是它们当前的进展(从0到100,100表示​​它们已完成)。如果我能编写一个列出分离的屏幕会话的Python脚本,然后一个接一个地附加和分离它们,阅读进度然后将它全部输出给我,对我来说会更容易。

我可以看到除了附加/分离部分之外的所有操作。或者screen中的参数是否会返回当前窗口?

对不起,如果这听起来很混乱,请不要犹豫,请你澄清。

2 个答案:

答案 0 :(得分:1)

如果您已经要使用脚本进行监控,那么通过python启动它们并管道输出会不会容易得多?

这可以通过默认Python库中的subprocess模块轻松完成。

答案 1 :(得分:1)

这是您可以使用的一种方法,而不是屏幕。它从您作为命令行参数传递的文件中读取需要运行的所有程序的列表。

import os
import sys
import subprocess
import threading
from queue import Queue
import time

lock = threading.Lock()
q = Queue()

def do_work(item):
    while True:
            line = item.stdout.readline().strip()

            if line == "":
                break
            elif line == "100":
                with lock:
                    print("Child process is a success.")

def worker():
    item = q.get()
    do_work(item)
    q.task_done()

def get_programs(filename):
    input = open(filename, "r")
    programs = []

    counter = 1

    for line in input:
        line = line.strip()
        if line.startswith(";"):
            continue
        if len(line) == 0:
            continue

        program = line.split(" ")

        if not os.path.exists(program[0]):
            print("ERROR: \"%s\" at line %s does not exist." % (program[0], counter))
            continue

        programs.append(program)

        counter += 1

    return programs

if __name__ == "__main__":
    if len(sys.argv) < 2 or not os.path.exists(sys.argv[1]):
        print("Please provide a valid program config file.")
        sys.exit()

    programs = get_programs(sys.argv[1])
    print("Loaded %s entries from \"%s\"." % (len(programs), sys.argv[1]))

    for program in programs:
        s = subprocess.Popen(program, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
        q.put(s)
        t = threading.Thread(target=worker)
        t.daemon = True
        t.start()

    q.join()
    print("All tasks are done.")

希望这有帮助,知道你是否需要任何修改,祝你好运!