কীভাবে ব্যবহারকারীর দ্বারা খোলা টার্মিনালের সংখ্যা সনাক্ত করা যায়


9

আমি উবুন্টু ব্যবহার করছি এবং নিজে পরিবর্তন করতে পারেন bashথেকে শেল প্রম্পট রঙ সবুজ ব্যবহার

export PS1="\e[0;32m[\u@\h \W]\$ \e[m" 

তবে আমি যখনই নতুন টার্মিনাল বা ট্যাবটি খুলি তখন শেল প্রম্পট রঙটি স্বয়ংক্রিয়ভাবে পরিবর্তিত হয়। আমি সচেতন যে বেসিক tty টিআরএম এর 16 টি রঙ রয়েছে এবং যদি 16 টিরও বেশি টার্মিনাল খোলা থাকে তবে রংগুলি ঘোরানো ঠিক আছে। সমাধানগুলি কি কাজ করবে যখন আমি মাধ্যমে সংযোগ করব Putty, tmuxবা screen

আমার ধারণা একটি শেল স্ক্রিপ্ট লিখে রাখুন মধ্যে হয় .bashrcযা নতুন টার্মিনাল সেশন ব্যবহারকারী খুলেছে সনাক্ত করে এবং থেকে একটি বিশ্বব্যাপী পাল্টা বাড়ায় \e[0;31m[করার \e[0;47m[। কিভাবে ব্যবহারকারী দ্বারা খোলা টার্মিনালের সংখ্যা সনাক্ত করতে?

উত্তর:


8

আপনার যদি খোলার টার্মিনালের সংখ্যাটি সত্যই পেতে হয় তবে আপনার নিজের মালিকানাধীন ফাইলগুলি গণনার জন্য যান /dev/pts(যদিও এটি গ্রাফিকাল টার্মিনাল এমুলেটর দ্বারা নয় ব্যাকগ্রাউন্ড প্রক্রিয়াগুলিতে খোলা ফাইলগুলি অন্তর্ভুক্ত থাকতে পারে)। বিকল্পভাবে, আপনার টার্মিনাল এমুলেটর (গুলি) এর শিশু প্রক্রিয়াগুলির সংখ্যা গণনা করুন, যেমন জ্যাকব তার প্রতিক্রিয়াটির প্রথম লাইনে দেখিয়েছেন।

whoএর আউটপুট উপর নির্ভর করা এবং gnome-pty-helperপ্রক্রিয়াগুলি অনুসন্ধান করা এড়িয়ে চলুন , কারণ এগুলি আরও নতুন gnome-terminalসংস্করণে কাজ করে না ।

মনে রাখবেন যে আজকাল সমস্ত গ্রাফিকাল টার্মিনাল এমুলেটর (পুটি সহ) এবং মাল্টিপ্লেক্সার (স্ক্রিন, টিএমউক্স) 256 টি রঙ সমর্থন করে। আপনি যদি এই প্যালেটটি ব্যবহার করেন তবে আপনি সত্যই সুন্দর রঙিন প্রম্পট পেতে পারেন।

খুব সহজ সমাধানের জন্য আমার সুপারিশটি হ'ল বর্তমান টিটিআই লাইনের সংখ্যার উপর ভিত্তি করে। উদাহরণস্বরূপ ttyকমান্ডের আউটপুট প্রক্রিয়া করে কেবলমাত্র নম্বরটি নিয়ে আসে এবং সেখান থেকে রঙ বের করে। একটি নির্দিষ্ট টাইটি লাইন নম্বর একবারে কেবল একটি টার্মিনালকে দেওয়া হয়, কার্নেল দ্বারা একই লাইন নম্বরটি পুনরায় প্রকাশ করার আগে আপনাকে প্রথমে সেই টার্মিনালটি বন্ধ করতে হবে। এটি, 256 টি রঙের সাথে মিলিত হয়ে স্বয়ংক্রিয়ভাবে গ্যারান্টি দেয় যে আপনি একটি নির্দিষ্ট সময়ে দু'বার একই রঙ দেখতে পাবেন না (এবং এমনকি 16 টি বর্ণের সাথে এটি একটি এমনকি এমনকি বিতরণও দিতে পারে)। বৈশ্বিক কাউন্টার বজায় রাখার প্রয়োজন নেই, এবং গণনা টার্মিনাল বা প্রক্রিয়াগুলির প্রয়োজন নেই।


1
সঙ্গে সুন্দর ধারণা tty। আমি অনুমান করি যে আমরা / অন্যরা "প্রশ্ন "টিতে খুব বেশি মনোনিবেশ করেছি এবং ভুলে গিয়েছি যে পুরো" প্রয়োজন "এর জন্য অন্যান্য সমাধান থাকতে পারে :) আমি এমনকি এলোমেলো রঙ নির্বাচনকারীকে প্রয়োগ করে খেলব। যদি এটি 256 টির রঙ হয় তবে একই / অনুরূপ রঙগুলি নির্বাচন করা বেশি হওয়া উচিত নয়। তবে প্রদত্ত পিটিএস সংখ্যার জন্য ম্যানুয়ালি রঙ সেট করা আরও ভাল ব্যক্তিগতকরণ দেবে।
গ্রেগডি

@TedM। হ্যাঁ প্রশ্নটি একটি এক্সওয়াই প্রশ্ন হিসাবে অনেকটা বর্ণিত হয়েছিল, এর লাইনটিতে: "আমি প্রতিটি টার্মিনালে আলাদা রঙ ধারণ করতে চাই, তাই বলুন: আমি কীভাবে টার্মিনালের সংখ্যা গণনা করব?"
উদাহরণস্বরূপ

@TedM। এলোমেলো একটি দুর্দান্ত ধারণা! (একটি ডিটারিমেটিক ম্যাপিংয়ের একটি সম্পত্তি হ'ল নতুন ব্যবহারকারী স্যুডিংয়ের পরে সহজেই একই প্রম্পট রঙটি সেট করতে পারে ask মূল প্রশ্নকর্তা যা চান তা এটি বা নাও পারে))
উদাহরণস্বরূপ

1
র্যান্ডোমাইজারটি বেশ সহজ: color="\e[38;5;"$(((RANDOM % 231 )+1))"m"(কেবল মাত্র ২৩১ গ্রেস্কেলকে প্রত্যাখ্যান করতে পারে) তবে এই রঙগুলির মধ্যে অনেকগুলি কেবল বিভিন্ন শেড এবং সেগুলির বেশ কয়েকটি অন্ধকার হতে পারে তাই প্রায় অদৃশ্য হতে পারে এবং আমি অনুমান করি যে বাস্তব জীবনে কেউ এটি ব্যবহার করবে না ...
গ্রেগডিডি

আমরা জিজ্ঞাসকের উবুন্টু সংস্করণ জানি না। 16.04 এ অবশ্যই জিনোম- পিটিআই -সহায়ক আর নেই ( git.gnome.org/browse/vte/commit/?id=299c700 )। পুরানো সংস্করণগুলিতে সঠিক প্রক্রিয়াক্রমিক স্তরটি পরীক্ষা করতে আমি ডাউনগ্রেড করতে যাচ্ছি না। আমি জানি যে এই জাতীয় প্রক্রিয়া ছিল, আমি পুরোপুরি নিশ্চিত নই যে পিতা-সন্তানের স্তরক্রমটি কেমন দেখাচ্ছে। যাইহোক, আমি আপনার আসল প্রতিক্রিয়া থেকে শিশু-প্রক্রিয়া-গণনা ধারণা নিয়েছি, তাই আমি বুঝতে পারি না "(আপনার দ্বারাও)", কিছুই নয়।
উদাহরণস্বরূপ

5

একক ব্যবহারকারীর পরিস্থিতিতে যদি আমরা উদাহরণটি নিই তবে আমরা xtermকেবল পিডের সংখ্যা গণনা করতে পারি xterm; xtermপ্রতিটি উইন্ডোর জন্য পৃথক পিড তৈরি করে।
gnome-terminalতবে একটি একক পিড চালায় তবে সুসংবাদটি হ'ল এটি প্রতিটি উইন্ডো এবং / অথবা ট্যাবের জন্য শিশু প্রক্রিয়া তৈরি করে। কমান্ড দ্বারা আমরা এই শিশু প্রক্রিয়াগুলি পুনরুদ্ধার করতে পারি:

pgrep -P <pid_of_gnome-terminal>

এর সাথে মোকাবিলা করার জন্য কয়েকটি জটিলতা রয়েছে:

  • আপনার প্রশ্নটি পড়া, আমরা ধরে নিতে পারি, এই ক্ষেত্রে সেই ব্যবহারকারী প্রকৃতপক্ষে এক্স-সেশনের মালিক । সাধারণত আমরা কেবল-পরিবর্তনশীল ব্যবহার করতে $USERপারি, তবে এটি বর্তমানে লগ ইন করা ব্যবহারকারীদের সাথে মেলে না $DISPLAY

  • একাধিক ব্যবহারকারীর পরিস্থিতিতে, (যেগুলির মধ্যে) টার্মিনাল অ্যাপ্লিকেশন সম্পর্কিত পিডগুলি বর্তমানের সাথে আবশ্যক নয় $DISPLAY। আমাদের কেবল প্রাসঙ্গিক পিড এবং চাইল্ড-পিডগুলি বিভক্ত করতে হবে।

  • ইউনিটিতে (15.10 বা নিম্ন), যদি কোনও দ্বিতীয় ব্যবহারকারী লগ ইন করে, একটি অতিরিক্ত প্রক্রিয়া শুরু হয় ( gnome-pty-helper), যা শিশু প্রক্রিয়া হিসাবে প্রদর্শিত হয় gnome-terminal, তবে প্রক্রিয়াটির (স্পষ্টতই) কোনও উইন্ডো বা ট্যাব নেই। উপর মাতে , প্রক্রিয়া যাহাই হউক না কেন বিদ্যমান।

সংক্ষেপে

টার্মিনাল অ্যাপ্লিকেশনটির ট্যাব এবং / অথবা উইন্ডোগুলির সংখ্যা গণনা করার জন্য আমাদের এগুলি করতে হবে:

  • দেখুন যে আমরা একটি টার্মিনাল অ্যাপ্লিকেশন চালাচ্ছি যার একাধিক পিড বা একক পিড রয়েছে $DISPLAY(এক্স-সেশন)
  • চলমান প্রক্রিয়াগুলি থেকে, কেবল এটি সম্পর্কিত চলমান পিডগুলি বিভক্ত করুন$DISPLAY
  • যদি অ্যাপ্লিকেশনটি তার পিডের জন্য চাইল্ড-প্রক্রিয়াগুলি চালায় (উইন্ডোজ / ট্যাবগুলির জন্য), gnome-pty-helperসংখ্যাটি সংশোধন করতে রান চলছে কিনা তা দেখুন।

বর্তমানে খোলার উইন্ডো এবং / বা ট্যাবগুলির সংখ্যা নির্ভরযোগ্যতার সাথে খুঁজে পেতে এটি খুব ভালভাবে স্ক্রিপ্ট করা যায়।

এই পান্ডুলিপি

নীচের স্ক্রিপ্টে, লক্ষ্যযুক্ত টার্মিনাল অ্যাপ্লিকেশনটি আর্গুমেন্ট হিসাবে ব্যবহৃত হয় । স্ক্রিপ্টটি এটি ব্যবহার করে অনেক টার্মিনালগুলিতে কাজ করে tested Tildaএই মুহূর্তে একটি ব্যতিক্রম ।

একটি উদাহরণ

  • আমার দু'জন ব্যবহারকারী লগ ইন করেছেন, একটি (বর্তমান নয়) দুটি gnome-terminalউইন্ডোতে, একটি (ছবিতে একটি) তিনটি gnome-terminalউইন্ডো এবং দুটি xtermউইন্ডো রয়েছে।

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

আদেশ:

/path/to/get_terms.sh gnome-terminal

আউটপুট:

3

যখন

/path/to/get_terms.sh xterm

আউটপুট:

2

এই পান্ডুলিপি

#!/bin/bash

terminal=$1

# get the user running the current x-session
username=$(who | grep $DISPLAY | head -1 | awk '{print $1}')
# get the pid of the terminal for the current user
userpid=$(pgrep -u $username $terminal)
# check what type the terminal is (multi pid/single pid)
npids="$(echo "$userpid" | wc -w)"
# in case of a single pid, count the children
if [ "$npids" -eq 1 ]; then
  # check if gnome-pty-helper runs (starts when multiple users are logged in)
  ptpid=$(pgrep gnome-pty-helpe)
  # get number of child- procs
  let "orig = $( pgrep -P $(pgrep -u $username $terminal) | wc -w )" 
  # if pty-helper runs, correct the number of child procs
  if [ -n "$ptpid" ] && [ -n "$userpid" ]; then
    let "n_terms = $orig-1"; else let "n_terms = $orig"
  fi
  # if no child procs run, n-terminals = n-counted pids (difference Mate <> Unity)
  if [ "$n_terms" -eq 0 ]; then echo $orig; else echo $n_terms; fi
# in case of multiple pids, count the pids
elif [ "$npids" -gt 1 ]; then echo $npids
fi

ব্যবহার করা

  • স্ক্রিপ্টটি একটি খালি ফাইলে অনুলিপি করুন, এটি সংরক্ষণ করুন, কার্যকর get_terms.shকরে দিন এবং আদেশ দ্বারা এটি চালনা করুন:

    /path/to/get_terms.sh <terminal_application>

ঠিক এখানেই আমার সর্বদা একটি gnome-pty-helperদৌড়া থাকে, এমনকি যখন কেবলমাত্র একজন ব্যবহারকারী লগইন থাকে (ডান রিবুটের পরে) এবং আমি যখন কোনও পরিমাণ টার্মিনাল খুলি তখন এটি দ্বিতীয়, একই সহায়ক runs আপনার নতুন স্ক্রিপ্টটি সাথ-টার্মিনালের জন্য কাজ করছে বলে মনে হচ্ছে (যেটি শূন্যের কারণ হতে পারে নি) তবে xterm সহ যখন আমার কেবল 1 টি খোলা আছে তখন এটি 0দ্বিতীয় নম্বর পরে এবং জিনোম-টার্মিনাল দিয়ে ভাল নম্বর দেখাতে শুরু করবে এটি সর্বদা একটি খুব কম দেখায় ( 0শুধুমাত্র যখন একটি খোলা হয় তখন আউটপুট )।
গ্রেগডি

@TedM। ধন্যবাদ, এটি দরকারী তথ্য, এখনই স্থির।
জ্যাকব Vlijm

আমি সত্যিই আপনার "আবেগকে" প্রশংসা করি :) ... তবে জিনোম-টার্মিনাল নিয়ে এখনও সমস্যা আছে। একজন 1 দেয়, 2 দেয় 1, তিনটি 2 দেয়, 4 দেয় 3, ইত্যাদি Plus. এছাড়াও আমার নতুন আবিষ্কার, মেটের "টিল্ডা" (আমার উত্তরটিতে এটি একটি অতিরিক্ত "অজানা" টার্মিনাল) জিনোম-টার্মিনাল হিসাবে একই সমস্যা রয়েছে তবে এটি ট্যাব সহ। এক্সটার্ম এবং সাথী-টার্মিনালটি যদিও ভাল কাজ করছে বলে মনে হচ্ছে।
গ্রেগডি

@TedM। উল্লেখ করার জন্য ধন্যবাদ! নির্বোধ প্রশ্ন, তবে আপনি কি সর্বশেষতম কোডটি ব্যবহারের বিষয়ে নিশ্চিত? 15.10 মেটের সমস্ত টেস্টে আমি ব্যতিক্রম ছাড়াই কাজ চালাই। আপনার সাথি সংস্করণ কি? অন ​​ইউনিটিতে সবকিছু ইতিমধ্যে ভাল কাজ করেছে।
জ্যাকব Vlijm

@TedM। আমার বেশিরভাগ ফাঁকা 15.10 মেটে, এটি ডিফল্টরূপে রয়েছে। ঠিক পরীক্ষা নিখরচায়! আমি কি আপনাকে আগামীকাল বা স্ক্রিপ্টের সম্পাদিত সংস্করণটি চালাতে এবং আউটপুট কোথাও পোস্ট করার জন্য জিজ্ঞাসা করতে পারি, আপনার ক্ষেত্রে ব্যতিক্রমের কারণ কী?
জ্যাকব ভ্লিজম

1

একটি awkউপায়:

who | awk 'BEGIN{count=0}{ if(NR!=1){count++} }END{print count}'

ব্যাখ্যা:

উপরে 1 লাইনার কমান্ড, awkটার্মিনাল গণনা খুঁজে ব্যবহার করা হয়। awkপ্রোগ্রামের অভ্যন্তরে , এটি কেবল কমান্ড - 1 দিয়ে রেখার রেখাটি পরীক্ষা করছে।


এটি আমার জন্য 0 ফেরত দেয় যা স্পষ্টত অসত্য ...
জান্না

বুলেট-প্রুফ বলে মনে হচ্ছে এটি আমার সাথী-টার্মিনালের জন্য খুব সুন্দর কাজ করে seems
গ্রেগডি

সংক্ষিপ্তভাবে: who | awk 'END{print NR - 1}'যেহেতু আপনি যা চান তা লাইনের সংখ্যা - ১
মুরু

0

সহজ উপায়টি কেবল চালনার জন্যও হতে পারে System Monitor(যদি আপনার লেখা আবশ্যক টার্মিনাল থেকে শুরু করা হয় gnome-system-monitor) এবং "প্রক্রিয়াগুলি" ট্যাব এর অধীনে চলমান প্রক্রিয়াগুলি নাম অনুসারে সাজান এবং Bashতালিকাতে উপস্থিতির সংখ্যা গণনা না করে (আপনি সাজিয়ে রাখলে সেগুলি একসাথে থাকবে) নাম, সুতরাং এটি গণনা করা সহজ)।

নোট করুন যে আপনি ব্যবহারকারীর দ্বারা খোলার টার্মিনালগুলির সংখ্যা দেখতে চাইলে আপনাকে অবশ্যই এটির সন্ধান করতে হবে Bashএবং তা নয় Gnome Terminal। একবার আপনি একটি টার্মিনাল খোলার পরে Gnome Terminalপ্রক্রিয়া তালিকায় উপস্থিত হবে তবে আরও টার্মিনালগুলি খোলার পরেও কেবল একটি থাকবে। "ভিউ" বোতামটি System Monitorআপনাকে কোন প্রক্রিয়াগুলি দেখার জন্য সেট করতে দেয়, যেমন। সমস্ত প্রক্রিয়া / ব্যবহারকারী প্রক্রিয়া / সক্রিয় ...


যেহেতু ওপি ফলাফলটি স্বয়ংক্রিয়ভাবে টার্মিনাল রঙ (গুলি) সেট করতে চায় তাই এটি কোনও প্রাসঙ্গিক বিকল্প বলে মনে হয় না।
জ্যাকব ভিলিজম

দুঃখিত আমি এখন এটি স্ক্রিপ্টে ব্যবহার করতে চাই use তবে তারপরে PS -ef করবে গ্রেপ ইউজারনেম | গ্রেপ বাশ | grep -v গ্রেপ | ডাব্লুসিএল-কাজ না?
নন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.