मैं एक साथ एक से अधिक टैब / शेल में एक ही लिनक्स कमांड कैसे चला सकता हूं?


33

क्या लिनक्स में कोई उपकरण / कमांड है जिसे मैं एक साथ एक से अधिक टैब में कमांड चलाने के लिए उपयोग कर सकता हूं? मैं एक ही कमांड चलाना चाहता हूं: ./myprog argument1 argument2एक से अधिक शेल में एक साथ यह जांचने के लिए कि म्यूटेक्स थ्रेडेड प्रोग्राम में ठीक काम कर रहा है या नहीं। मैं इस कार्यक्रम के उदाहरणों की संख्या को बढ़ाने में सक्षम होना चाहता हूं ताकि बाद में अपने कोड को तनाव में डाल सकूं।

मैं किसी चीज की तलाश में हूं जैसे कि दीवार क्या करती है। मैं टटी का उपयोग करने के बारे में सोच सकता हूं, लेकिन यह बहुत दर्द की तरह लगता है अगर मुझे इसे कई और गोले के पैमाने पर करना होगा।


1
"किसी भी समय आप अपने आप को एक दोहरावदार कार्य करते हुए पाते हैं जिसमें एक कंप्यूटर शामिल होता है, इसे स्वचालित करें" - मुझे । मुझे लगता है कि आप लोड टेस्टिंग के लिए कई टर्मिनल टैब का उपयोग करके खुद को एक असंतुष्ट कर रहे होंगे क्योंकि आपको उन सभी को देखना होगा जो थकाऊ है। एक कार्यक्रम के लिए बेहतर है जो बच्चे के myprogउदाहरणों को जन्म देता है और आपके लिए उनका आउटपुट एकत्र करता है।
msw

1
सामान्य मल्टी-थ्रेडिंग में प्रक्रियाओं के बीच एक म्यूटेक्स नहीं है ...?
एरॉन डी। मैरास्को

@msw: हाँ, लेकिन क्या होगा अगर मैं यह देखना चाहता हूं कि अंतिम उपयोगकर्ता क्या देखेगा जब वह अपने टर्मिनल से एक ही कमांड चलाता है और जब मैंने स्केल किया कि 100 कहने के लिए, वे अपनी स्क्रीन पर क्या देखेंगे? यह निर्धारित करने के लिए एक वैध बात नहीं है?
अर्पित

@ आरोनड.मार्स्को: मैं उन म्यूटेक्स की जांच करना चाहता हूं, जिन्हें मैंने यूजर स्पेस में डाला है।
1

इसलिए एक सुपरवाइजर के तहत 99 इंस्टेंसेस चलाएं और एक टर्मिनल में 100 वां रन बनाएं। मैंने स्वीकार किया कि आप एक साथ 100 टर्मिनल देख सकते हैं, यदि हां, तो मैं प्रभावित हूं।
msw

जवाबों:


46

जैसा कि माविलन ने पहले ही सुझाव दिया था, बस टर्मिनेटर का उपयोग करें । यह टाइल वाले तरीके से कई टर्मिनलों को प्रदर्शित करने की अनुमति देता है। प्रसारण सुविधा को सक्षम करते समय, आप प्रत्येक टर्मिनल पर एक साथ एक ही कमांड दर्ज कर सकते हैं।

यहां 32 टर्मिनलों के ग्रिड पर प्रसारित तिथि कमांड के साथ एक उदाहरण है।

terminatorx32


3
बहुत बढ़िया है!
अफर

मैं आसानी से 32 टर्मिनल कैसे खोल सकता हूं?
अन्नान

6
@Annan टर्मिनेटर कस्टम लेआउट का समर्थन करता है, unix.stackexchange.com/a/168445/2594 और askubuntu.com/a/178242/18306
jlliagre

11

tmux में यह क्षमता है। (एक ही नस में कई अन्य उपयोगी क्षमताओं के साथ)

के माध्यम से किया जा सकता है:

:setw synchronize-panes on

क्या आप शीघ्र ही वर्णन कर सकते हैं कि tmux कैसे करता है - या एक लिंक पेस्ट करें? धन्यवाद!
एली

1
: सेट पर सिंक्रोनाइज़-पैनेस
माइकल मार्टिनेज

9

Multixterm

सूची में जोड़ने के लिए एक और उपकरण एक कहा जाता है multixterm। यह xtermटर्मिनलों का उपयोग करता है। आप इसे इस तरह से आह्वान कर सकते हैं:

$ multixterm

और एक बार आपको एक GUI के साथ प्रस्तुत किया जाएगा।

                                                         gui के एस.एस.

फिर आप बटन पर xtermक्लिक करके विंडो को स्पिन करना शुरू कर सकते हैं new xterm। यहाँ उदाहरण के लिए मैंने मंगवाया है 2. यदि आप प्राथमिक खिड़की पर क्लिक करते हैं, तो आप दोनों विंडो में एक साथ कमांड लिखना शुरू कर सकते हैं:

   xtems के एस.एस.

keyboardcast

केवल उबंटू पर उपलब्ध होने के लिए प्रकट होता है, मल्टीएक्सटर के समान दिखता है।

अंश

कीबोर्डकास्ट का उद्देश्य आपको एक बार में कई X विंडो में कीस्ट्रोक्स भेजने की अनुमति देना है। यह आपको उदाहरण के लिए, बड़े पैमाने पर प्रशासन के प्रयोजनों के लिए अलग-अलग लेकिन समान मेजबानों से जुड़े टर्मिनलों की एक संख्या को नियंत्रित करने की अनुमति देता है।

आप गैर-टर्मिनलों का भी चयन कर सकते हैं। यदि आप इस क्षमता के लिए एक उचित उपयोग के साथ आते हैं, तो मुझे इसके बारे में सुनने में दिलचस्पी होगी।

कार्यक्रम अपने शीर्षक (एक विकल्प का उपयोग करके) या उन पर क्लिक करके (जीआईएमपी के स्क्रीनशॉट सुविधा के समान विधि में) का चयन करके या तो भेजने के लिए विंडोज़ का चयन कर सकता है।

कार्यक्रम में कई तर्कों पर एक ही आदेश को निष्पादित करने वाले सूक्ति-टर्मिनल के कई उदाहरणों को अलग-अलग करने की क्षमता भी है (उदाहरण के लिए कई मेजबानों पर 'ssh' को निष्पादित करना)। यदि यह मौजूद है (तो, उदाहरण के लिए, आपके फ़ॉन्ट का आकार छोटा हो सकता है)


रखवाले! नोट लिया गया।
रनलेवेल0

ऐसा लगता है कि कीबोर्डकास्ट टूट गया है, जो निराशाजनक है।
RJ

9

इसे iTerm2 का उपयोग करके प्राप्त किया जा सकता है

संदर्भ: http://korishev.com/blog/2014/02/28/iterm2-broadcast-input/

यहाँ छवि विवरण दर्ज करें


लिनक्स संबंधित नहीं है, क्योंकि iTerm केवल मैक ओएस है और सवाल स्पष्ट रूप से लिनक्स समाधान के बारे में पूछ रहा है।
आरजे

8

आप कुछ ऐसा कर सकते हैं:

max_processes=20
for ((i=0; i<$max_processes; i++))
do 
    /path/to/myprog arg1 arg2 > /tmp/myprog.${i}.log &
done

या यदि निष्पादन के दौरान प्रत्येक कमांड का आउटपुट प्रासंगिक है, तो आप स्क्रीन को सेटअप कर सकते हैं।

vi ~/.screenrc
screen -t inst1    1 /path/to/myprog arg1 arg2
screen -t inst2    2 /path/to/myprog arg1 arg2
screen -t inst3    3 /path/to/myprog arg1 arg2
screen -t inst4    4 /path/to/myprog arg1 arg2

स्क्रीन को अधिक मैनुअल काम की आवश्यकता होती है।


क्या आप स्क्रीन समाधान पर अधिक विस्तार कर सकते हैं? मैं जो चाहता हूँ,
उसके अनुरूप

सिर्फ tail -fसौ स्क्रीन स्थापित करने के बजाय लॉग फाइल क्यों नहीं ।
रेयान

@ स्क्रीन को एक ही बार में कई टर्मिनलों से जोड़ दें। यदि आप उन सभी को "वास्तविक समय" में देखना चाहते हैं तो आप स्क्रीन का उपयोग कर सकते हैं। यद्यपि व्यक्तिगत रूप से मैं लॉगफ़ाइल्स के साथ जाऊंगा, आप एक संदेश भेजने के लिए अपने प्रोग को सेट कर सकते हैं या वास्तव में अपने प्रोग को प्रत्येक उदाहरण के लिए लॉगफ़ाइल लिख सकते हैं (उदा: myprog.pid.log)
BitsOfNix

@ LieRyan क्योंकि जब तक आप कुछ प्रक्रिया के साथ लॉग इन कर रहे होते हैं, तब तक आपको प्रत्येक प्रक्रिया के लिए एक अलग फ़ाइल में लॉग इन करना होगा। यदि आप बस एक ही समय में 20+ प्रक्रियाओं को एक ही फ़ाइल में लिखने का प्रयास करते हैं तो आपके पास एक बुरा समय आने वाला है।
साम्पेच

@ समिच:tail -f *.log
रयान

5

मैं एक केडीई उपयोगकर्ता हूं, KDE 4.13.3 पर कोनसोल 2.13.2 के साथ आप यह कर सकते हैं:

  1. खुला कोनोला

  2. विभाजन को लंबवत देखें यहाँ छवि विवरण दर्ज करें

  3. खिड़की के अंदर प्रत्येक टर्मिनल पर एक साथ लिखें यहाँ छवि विवरण दर्ज करें


4

टर्मिनेटर (एमुलेटर टर्मिनल) का प्रयास करें। इसमें एक ही विंडो में कई शेल सत्र हो सकते हैं और आप उन सभी के लिए एक कमांड प्रसारित कर सकते हैं।

टर्मिनेटर


3

आप MobaXterm जैसे टूल का उपयोग कर सकते हैं और यह आपको एक साथ कनेक्ट करने की अनुमति देगा और फिर अपनी सभी विंडो में अपनी कमांड पेस्ट कर देगा।


लिनक्स से संबंधित नहीं, मोबाइल फोन के रूप में, यह क्या करता है के लिए बहुत प्रभावशाली है, केवल विंडोज है और सवाल स्पष्ट रूप से लिनक्स समाधान के बारे में है।
RJ

3

यदि आप केवल 100 वें प्रोग्राम के निष्पादन से आउटपुट देखना चाहते हैं:

#!/bin/bash

prog="/path/to/myprog"
args="argument1 argument2"
max=100
for i in $(seq $max); do
    if [ $i -lt $max ]; then
        exec $prog $args &> /dev/null &
    else
        exec $prog $args
    fi
done

2

के konsoleमाध्यम से नियंत्रित कर सकते हैं DCOP। एक उदाहरण यहाँ से है :

#!/bin/bash

checkfile() {
  if [ ! -f $1 ]; then
    echo "could not find $1"
    exit 99
  else
    echo "OK"
  fi
}

# Check for App1 XML
echo -n "Checking for App 1 XML... "
XMLA=/domain/DM.xml
checkfile ${DEVROOT}/${XMLA}

# Check for App2 XML
echo -n "Checking for App 2 XML... "
hostname=$(hostname)
XMLB=/domain/DM_${hostname}.xml
checkfile ${DEVROOT}/${XMLB}

# Launch Konsole
echo -n "Launching konsole... "
K=$(dcopstart konsole-script)

[ -z "${K}" ] && exit 98
# Create second tab and resize
SDA=$(dcop $k konsole currentSession)
SDB=$(dcop $k konsole newSession)
dcop $K $SDA setSize 121x25

# Let bash login, etc.
sleep 1

# Rename the tabs
dcop $K $SDA renameSession "App 1"
dcop $K $SDB renameSession "App 2"

# Start services, letting user watch
echo -n "starting app1... "
dcop $K konsole activateSession $SDA
dcop $K $SDA sendSession "echo -ne '\033]0;DEV (${hostname})\007' && clear && starter $XMLA"
sleep 2
echo -n "starting app2... "
dcop $K konsole activateSession $SDB
dcop $K $SDB sendSession "echo -ne '\033]0;DEV (${hostname})\007' && clear && starter $XMLB"
echo done.

2
sh <<-STRESS & 
$( printf 'myprog &\n%.0b' \
    `seq 1 ${MAX_CONCURRENT_PROCS}` )
STRESS
echo "$!"

मैं ऊपर टिप्पणी @msw के साथ सहमत हूँ। यह आपको एक स्क्रिप्ट लिखेगा जिसे एक पृष्ठभूमि वाली shप्रक्रिया द्वारा लॉन्च किया जाएगा और चाइल्ड shप्रोसेस की पीड को प्रिंट करें ताकि आप इसे और इसके बच्चों की निगरानी कर सकें क्योंकि यह काम करता है।


2

@ जेनपेंग जीएनयू समानांतर के साथ सही रास्ते पर था , सिर्फ कार्यान्वयन नहीं।

उदाहरण: अपने प्रोग्राम के 10 समानांतर उदाहरण चलाएं, प्रत्येक धागे के साथ केवल एक बार अपना प्रोग्राम चलाएं:

parallel -j10 './myprog argument1 argument2 #' ::: {1..10}

उदाहरण: 10 समानांतर थ्रेड्स चलाएँ, जिनमें से प्रत्येक थ्रेड आपके प्रोग्राम को असीम रूप से चला रहा है:

parallel -j10 'while true ; do ./myprog argument1 argument2 ; done #' ::: {1..10}

आप 10मेरे उदाहरणों को बदलकर आसानी से इसे सैकड़ों सूत्र में पिरो सकते हैं।

parallel -j200     ...     ::: {1..200}

यदि आपका प्रोग्राम किसी भी स्टडआउट संदेश का उत्पादन करता है और आप उन्हें देखना चाहते हैं क्योंकि वे उत्पादित होते हैं (बजाय डिफ़ॉल्ट जो उन्हें टकराते हैं), --ungroupसमानांतर का विकल्प उपयोगी हो सकता है।

parallel --ungroup   ...

यदि आप अपने कार्य केंद्र से बहुत सारे थ्रेड चला रहे हैं और यह नहीं चाहते हैं कि चीजें अनुत्तरदायी हो जाएं, तो niceलॉन्च समय पर पूरी प्रक्रिया को घटाएं।

nice -n19 parallel   ...

साइड नोट, जीएनयू समानांतर आमतौर पर डिफ़ॉल्ट रूप से स्थापित नहीं है, लेकिन अपने सामान्य पैकेज रेपोस में आमतौर पर है, इसलिए किसी भी अन्य पैकेज की तरह इसे स्थापित: dnf install parallel, apt-get install parallel, brew install parallel, आदि


1

आप पृष्ठभूमि के साथ प्रक्रिया शुरू कर सकते हैं nohup

उदाहरण:

nohup ./myprog -arg1 -arg2 &

आउटपुट:

[1] 1769    
nohup: ignoring input and appending output to 'nohup.out'

दिए गए कार्य को बाद में करना याद रखें PID:

kill 1769

अग्रभूमि में इस प्रक्रिया को लाने के लिए आपको जॉबनिंबर में प्रवेश करना होगा, इस मामले में [1]:

fg %1


0

मेरे छोटे से चक्की:

#!/bin/sh

[ $# -lt 1 ] && {
        echo "Use: $0 <file>
        where file includes list of server"
        exit 9
}

cp ~/.config/terminator/config ~/.config/terminator/config.`date +%Y%m%d-%H%M`

cat ~/.config/terminator/config.`date +%Y%m%d-%H%M`|grep -v "^.plugins" >~/.config/terminator/config

inc=5
echo "  [[terms]]" >>~/.config/terminator/config
for i in `cat $1` ; do
        echo "   [[[window${inc}]]]"
        echo "       type = Window"
        echo "   [[[terminal${inc}]]]"
        echo "     profile = default"
        echo "     order = 0" 
        echo "     type = Terminal"
        echo "     parent = window${inc}"
        echo "     command = ssh $i"
        inc=$((inc+1))
done >>~/.config/terminator/config

echo "[plugins]" >>~/.config/terminator/config

एक समूह में कई विंडो के लिए टर्मिनेटर कॉन्फिगर (लेआउट शब्द) बनाएंगे।

संपादित करें: कम से कम, टर्मिनेटर एक ही समूह में प्रत्येक टर्मिनल में प्रसारण भेजने में सक्षम है। यह फ़ंक्शन switchable है - इसलिए आप इसे 'su -' लिखने में सक्षम कर सकते हैं और फिर प्याज टर्मिनलों के लिए ओवेन पासवर्ड को अक्षम कर सकते हैं और फिर से सक्षम कर सकते हैं।


1
क्या यह बेहतर है? अंग्रेजी अस्वस्थ कृपया :) मुझे माफ करना
मारेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.