특정 터미널 창에 명령을 보내려면 어떻게해야합니까?


13


별도의 터미널에서 여러 프로그램 (서버)을 동시에 여는 스크립트를 작성하고 싶습니다. 어느 것이 중요하지는 않으며 올바른 터미널 내부에 "랜딩"명령을 사용하여 다른 터미널에 다른 명령을 할당하고 싶습니다. 이게 가능해?
아마도 이런 식으로 :

  1. 열린 터미널 1
  2. open terminal2 // 동시에 1과 함께.
  3. command1 // 새 터미널 창을 열지 않고 terminal1에서 실행
  4. command2 // 새 터미널 창을 열지 않고 terminal2에서 실행
  5. ...

어떻게 터미널 터미널에 레이블을 붙여 명령이 올바른 터미널 내에서 실행되도록 할 수 있습니까?

또한 프로그램이 실행되는 동안 모든 터미널을보고 싶습니다. 프로그램에는 터미널에 추적 / 디버그를 인쇄하는 인수가 있습니다. 그래서 어떤 메시지가 서로 교환되는지 확인하고 싶습니다.

참고 :이 스크립트는 "시뮬레이션"역할을하므로 교환 된 데이터의 보안에 대해 덜 걱정합니다. localhost의 할당 된 포트에서 실행되도록 각 서버를 구성했습니다.


pssh 확인 ....
heemayl

타이밍이 얼마나 정확해야 하는가; 2 초 (터미널 당)의 마지가 적절합니까?
Jacob Vlijm 2016 년

@JacobVlijm : 터미널 "창"에 따라 명령을 올바르게 할당하는 것이 더 중요합니다
Aliakbar Ahmadi 2016

1
특히 시뮬레이션과 관련하여 수행 할 수 있습니다. :)
Jacob Vlijm

1
@JacomVlijm : 실제로 내 질문은 우연히 해결되었습니다. 명령을 올바른 인스턴스로 보내려면 각 명령 앞에 인스턴스가 시작하는 datadir이 있어야합니다! 그러나 내 행운을 위해 이것은 비트 코인으로 구현되지만 질문에 대답하지 않을 것입니다. 어쩌면 누군가가 어떤 프로그램에 대해보다 일반적인 아이디어를 내놓을 것입니다!? :) 그러나 감사합니다!
Aliakbar Ahmadi 2016

답변:


14

언급 했으므로 특정 상황에서 문제를 해결하기 위해 범용 솔루션 아래에서 설명했습니다. xdotool--sync옵션 덕분에 내가 실행 한 테스트에서 매우 안정적으로 작동합니다. 특정 터미널 창에 명령을 "전송"할 수 있었고 예외없이 완벽하게 실행되었습니다.

실제로 작동하는 방식

이 솔루션은 두 가지 옵션을 실행할 수있는 스크립트에서 존재 -set하고 -run:

  1. 이 예제에서 임의의 수의 터미널 창 을 설정 (열기) 하려면

    target_term -set 3

    세 개의 새로운 터미널이 열리면 창 ID가 숨겨진 파일로 기억됩니다.

    여기에 이미지 설명을 입력하십시오

    명확성을 위해 터미널 창을 최소화했습니다.

  2. 이제 세 개의 창을 만들었으므로 run 명령을 사용하여 그 중 하나에 명령을 보낼 수 있습니다 (예 :).

    target_term -run 2 echo "Monkey eats banana since it ran out of peanuts"

    아래에 표시된 것처럼 명령은 두 번째 터미널에서 실행되었습니다.

    여기에 이미지 설명을 입력하십시오

    이어서 첫 번째 터미널에 명령을 보낼 수 있습니다.

     target_term -run 1 sudo apt-get update

    만들기 sudo apt-get update터미널 1에서 실행 :

    여기에 이미지 설명을 입력하십시오

    등등...

설정 방법

  1. 스크립트는 모두 필요 wmctrl하고를 xdotool:

    sudo apt-get install wmctrl xdotool
  2. 아래의 스크립트를 빈 파일에 복사하고 target_term(확장자 없음!) 으로 안전한 곳으로 ~/bin만드십시오 ( ~/bin필요한 경우 디렉토리를 작성하십시오 ) .

  3. 스크립트를 실행 가능하게하고 (잊지 마십시오) 로그 아웃 / 로그인하거나 다음을 실행하십시오.

    source ~/.profile
  4. 이제 필요한 창 수를 인수로하여 터미널 창을 설정하십시오.

    target_term -set <number_of_windows>
  5. 이제 다음 명령을 사용하여 터미널 중 하나에 명령을 "전송"할 수 있습니다.

    target_term -run <terminal_number> <command_to_run>

스크립트

#!/usr/bin/env python3
import subprocess
import os
import sys
import time
#--- set your terminal below
application = "gnome-terminal"
#---

option = sys.argv[1]
data = os.environ["HOME"]+"/.term_list"

def current_windows():
    w_list = subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8")
    w_lines = [l for l in w_list.splitlines()]
    try:
        pid = subprocess.check_output(["pgrep", application]).decode("utf-8").strip()
        return [l for l in w_lines if str(pid) in l]
    except subprocess.CalledProcessError:
        return []

def arr_windows(n):
    w_count1 = current_windows()
    for requested in range(n):
        subprocess.Popen([application])
    called = []
    while len(called) < n:
        time.sleep(1)
        w_count2 = current_windows()
        add = [w for w in w_count2 if not w in w_count1]
        [called.append(w.split()[0]) for w in add if not w in called]
        w_count1 = w_count2

    return called

def run_intterm(w, command):
    subprocess.call(["xdotool", "windowfocus", "--sync", w])
    subprocess.call(["xdotool", "type", command+"\n"]) 

if option == "-set":
    open(data, "w").write("")
    n = int(sys.argv[2])
    new = arr_windows(n)
    for w in new:
        open(data, "a").write(w+"\n")
elif option == "-run":
    t_term = open(data).read().splitlines()[int(sys.argv[2])-1]
    command = (" ").join(sys.argv[3:])
    run_intterm(t_term, command)

노트

  • 스크립트는로 설정되어 gnome-terminal있지만 스크립트 application의 head 섹션에서 를 변경하여 모든 터미널 (또는 다른 프로그램)에 사용할 수 있습니다 .

    #--- set your terminal below
    application = "gnome-terminal"
    #---
  • 위의 명령은 물론 어떤 종류의 시뮬레이션에 사용하기 위해 스크립트에서 실행할 수도 있습니다.
  • 스크립트는 대상 창 모두에 초점이 있고 명령 입력이 완료 될 때까지 대기하므로 명령은 항상 오른쪽 터미널 창에 들어갑니다.
  • 스크립트가 명령에 의해 호출 된 터미널 설정 (windows)에서만 작동한다고 말할 필요는 없습니다.

    target_term -set

    그러면 질문에서 언급 한 것처럼 터미널 창에 스크립트가 "라벨"로 표시됩니다.

  • target_term세션 을 시작하는 경우 스크립트로 만든 숨겨진 파일을 덮어 쓰므로 제거 할 필요가 없습니다.

감사합니다! 이 스크립트가 작동하려면 python 3.x도 필요합니다.
pompalini
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.