আমি কীভাবে নির্দিষ্ট টার্মিনাল উইন্ডোতে আদেশ পাঠাতে পারি?


13


আমি একাধিক প্রোগ্রাম (সার্ভার) একযোগে পৃথক টার্মিনালগুলিতে খোলার জন্য একটি স্ক্রিপ্ট লিখতে চাই - কোনটি গুরুত্বপূর্ণ নয় - এবং সঠিক টার্মিনালের ভিতরে "অবতরণ" কমান্ড সহ বিভিন্ন টার্মিনালগুলিতে বিভিন্ন কমান্ড বরাদ্দ করি। এটা কি সম্ভব?
হতে পারে, এরকম কিছু:

  1. টার্মিনাল 1 খুলুন
  2. টার্মিনাল 2 খুলুন // এক সাথে 1 দিয়ে।
  3. কমান্ড 1 // একটি নতুন টার্মিনাল উইন্ডো খোলা ছাড়াই টার্মিনাল 1 এ এক্সিকিউট করুন
  4. কমান্ড 2 // একটি নতুন টার্মিনাল উইন্ডো না খোলা টার্মিনাল 2 এ এক্সিকিউট করুন
  5. ...

কমান্ডগুলি সঠিক টার্মিনালের ভিতরে কার্যকর করা যায় তাই আমি কি কোনওভাবে টার্মিনাল উইন্ডোগুলি লেবেল করতে পারি?

আমি সমস্ত প্রোগ্রামগুলির চলাকালীন সমস্ত টার্মিনালগুলিও দেখতে চাই - আমার প্রোগ্রামগুলির টার্মিনালে ট্রেস / ডিবাগ মুদ্রণের জন্য একটি যুক্তি রয়েছে। সুতরাং আমি দেখতে চাই যে তাদের মধ্যে কী বার্তাগুলি বিনিময় হয়।

দ্রষ্টব্য: আমি এক্সচেঞ্জ করা ডেটা সুরক্ষার বিষয়ে কম উদ্বিগ্ন যেহেতু এই স্ক্রিপ্টটি "সিমুলেশন" হিসাবে পরিবেশন করা উচিত। আমি লোকালহোস্টের একটি বরাদ্দ পোর্ট থেকে চালানোর জন্য প্রতিটি সার্ভারকে কনফিগার করেছি।


পিএসএস পরীক্ষা করুন ....
হিমাইল

সময়টি কতটা সঠিক হতে হবে; এর একটি মার্জ কি 2 সেকেন্ড (প্রতি টার্মিনাল) বলা উপযুক্ত?
জ্যাকব ভিলিজম

@ জ্যাকবভিজিম: টার্মিনাল "উইন্ডো" অনুযায়ী সঠিকভাবে আদেশগুলি নির্ধারণ করা আমার পক্ষে আরও গুরুত্বপূর্ণ
আলিয়াকবার আহমদী

1
সম্পন্ন করা যায়, বিশেষত যখন এটি সিমুলেশন সম্পর্কিত হয়, আবার পোস্ট করবে :)
জ্যাকব ভিলিজ

1
@ জ্যাকমভ্লিজ্ম: আসলে আমার প্রশ্নটি ঘটনাক্রমে সমাধান হয়েছে: সঠিক কমান্ড প্রেরণের জন্য প্রতিটি কমান্ড অবশ্যই দাদাদিরের সাথে উপস্থাপিত হওয়া উচিত যা দৃষ্টান্তটি শুরু হয়! তবে আমার ভাগ্যের জন্য এটি বিটকয়েনে প্রয়োগ করা হয়েছে তবে আমি কেবল উত্তরটি উত্তর ছাড়াই ছেড়ে দেব .. সম্ভবত যে কোনও প্রোগ্রামের জন্য আরও সাধারণ ধারণা নিয়ে আসে !? :) তবে ধন্যবাদ!
আলিয়াক্বর আহমদী

উত্তর:


14

যেহেতু আপনি উল্লেখ করেছেন যে আপনি আপনার নির্দিষ্ট পরিস্থিতির জন্য সমস্যার সমাধান করেছেন, সাধারণ উদ্দেশ্যে একটি সমাধানের নীচে। xdotoolএর --syncবিকল্পটির জন্য ধন্যবাদ , আমি যে পরীক্ষাগুলি চালিয়েছিলে এটি নির্ভরযোগ্যভাবে কাজ করে; আমি নির্দিষ্ট টার্মিনাল উইন্ডোগুলিতে কমান্ডগুলি "প্রেরণ" করতে পারি এবং এটি ব্যতিক্রম ছাড়াই পুরোপুরি চলে।

এটি বাস্তবে কীভাবে কাজ করে

সমাধানটি একটি স্ক্রিপ্ট থেকে বিদ্যমান যা দুটি বিকল্পের সাথে চালানো যেতে পারে -setএবং -run:

  1. করতে সেট এই উদাহরণে 3 টার্মিনাল জানালার কোনও একটি সংখ্যার আপ (খোলা):

    target_term -set 3

    তিনটি নতুন টার্মিনাল খুলবে, তাদের উইন্ডো আইডি একটি লুকানো ফাইলের মধ্যে মনে থাকবে:

    এখানে চিত্র বর্ণনা লিখুন

    স্পষ্টতার কারণে আমি টার্মিনাল উইন্ডোটি ন্যূনতম করলাম আমি কমান্ডটি চালিয়েছি :)

  2. এখন যেহেতু আমি তিনটি উইন্ডোজ তৈরি করেছি, আমি রান কমান্ডের মাধ্যমে তাদের যে কোনও একটিতে কমান্ড প্রেরণ করতে পারি (যেমন):

    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 updateTerminal 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স্ক্রিপ্টের প্রধান অংশটি পরিবর্তন করে কোনও টার্মিনাল (বা অন্য প্রোগ্রামের জন্য) ব্যবহার করা যেতে পারে :

    #--- set your terminal below
    application = "gnome-terminal"
    #---
  • উপরের কমান্ডগুলি (অবশ্যই) কোনও স্ক্রিপ্ট থেকে চালানো যেতে পারে আপনি যদি কোনও ধরণের সিমুলেশনের জন্য এটি ব্যবহার করতে লিল করেন তবে।
  • উভয় লক্ষ্যযুক্ত উইন্ডোতে ফোকাস না হওয়া এবং কমান্ডটি টাইপ করা শেষ না হওয়া পর্যন্ত স্ক্রিপ্ট অপেক্ষা করে, সুতরাং কমান্ডটি সর্বদা ডান টার্মিনাল উইন্ডোতে অবতরণ করবে।
  • বলার দরকার নেই যে স্ক্রিপ্টটি কেবলমাত্র টার্মিনাল সেটআপ (উইন্ডোজ) দিয়ে কাজ করে যা কমান্ড দ্বারা ডাকা হয়েছিল:

    target_term -set

    টার্মিনাল উইন্ডোগুলি তখন স্ক্রিপ্ট দ্বারা "লেবেলযুক্ত" হবে, যেমন আপনি আপনার প্রশ্নের উল্লেখ করেছেন।

  • আপনি যদি নতুন target_termসেশন শুরু করেন, স্ক্রিপ্ট দ্বারা নির্মিত লুকানো ফাইলটি কেবল ওভাররাইট করা হবে, অন্যথায় এটি অপসারণ করার প্রয়োজন নেই।

ভাল লাগল, ধন্যবাদ! এই স্ক্রিপ্টটি কাজ করার জন্য অজগর 3.x এরও প্রয়োজনীয়তা লক্ষ করা উচিত।
পোমপালিনী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.