ฉันจะรันคำสั่ง linux เดียวกันในแท็บ / เชลล์มากกว่าหนึ่งรายการพร้อมกันได้อย่างไร


33

มีเครื่องมือ / คำสั่งใน Linux ที่ฉันสามารถใช้เพื่อเรียกใช้คำสั่งในมากกว่าหนึ่งแท็บพร้อมกันหรือไม่ ฉันต้องการรันคำสั่งเดียวกัน: ./myprog argument1 argument2พร้อมกันในเชลล์มากกว่าหนึ่งอันเพื่อตรวจสอบว่า mutex ทำงานได้ดีในโปรแกรม threaded หรือไม่ ฉันต้องการเพิ่มจำนวนอินสแตนซ์ของโปรแกรมนี้เพื่อใส่รหัสของฉันภายใต้ความเครียดในภายหลัง

ฉันกำลังมองหาบางอย่างที่กำแพงทำ ฉันสามารถนึกถึงการใช้ tty ได้ แต่มันก็ดูเหมือนจะเจ็บปวดมากถ้าฉันต้องไต่ระดับนี้ให้มากขึ้น


1
"เมื่อใดก็ตามที่คุณพบว่าตัวเองทำเป็นงานที่ซ้ำ ๆ ที่เกี่ยวข้องกับคอมพิวเตอร์โดยอัตโนมัติมัน" - ฉัน ฉันคิดว่าคุณอาจกำลังก่อความเสียหายด้วยการใช้แท็บเทอร์มินัลหลายตัวสำหรับการทดสอบโหลดเนื่องจากคุณต้องดูทั้งหมดที่น่าเบื่อ ดีกว่าที่จะมีหนึ่งโปรแกรมที่วางไข่myprogอินสแตนซ์ของเด็กและรวบรวมเอาท์พุทของพวกเขาสำหรับคุณ
msw

1
มัลติเธรดแบบปกติไม่ได้มี mutex ระหว่างกระบวนการ ... ?
Aaron D. Marasco

@msw: ใช่ แต่ถ้าฉันต้องการที่จะเห็นสิ่งที่ผู้ใช้จะเห็นเมื่อเขาวิ่งคำสั่งเดียวกันจาก terminal ของเขาและเมื่อฉันปรับขนาดที่จะพูด 100 พวกเขาจะเห็นอะไรบนหน้าจอของพวกเขา? นั่นไม่ใช่สิ่งที่ถูกต้องที่จะตัดสินใช่ไหม
Arpith

@ AaronD.Marasco: ฉันต้องการตรวจสอบ mutexes ที่ฉันใส่ในพื้นที่ของผู้ใช้
Arpith

ดังนั้นให้เรียกใช้อินสแตนซ์ 99 รายการภายใต้ผู้ควบคุมเดียวและเรียกใช้อันดับที่ 100 ในเทอร์มินัล ฉันยอมรับว่าคุณอาจจะสามารถรับชม 100 ขั้วพร้อมกันถ้าเป็นเช่นนั้นฉันก็ประทับใจ
msw

คำตอบ:


46

ในฐานะที่เป็น mavillan แนะนำแล้วเพียงแค่ใช้เทอร์มิ อนุญาตให้แสดงเทอร์มินัลจำนวนมากในแบบเรียงต่อกัน เมื่อเปิดใช้งานคุณสมบัติการออกอากาศคุณสามารถป้อนคำสั่งเดียวกันพร้อมกันในแต่ละเทอร์มินัล

นี่คือตัวอย่างที่มีคำสั่ง date ที่ส่งไปยังกริด 32 เทอร์มินัล

terminatorx32


3
ประณามนี่มันยอดเยี่ยมมาก!
Afr

ฉันจะเปิด 32 เทอร์มินัลได้อย่างไร?
Annan

6
@Annan Terminator รองรับรูปแบบที่กำหนดเองดูที่unix.stackexchange.com/a/168445/2594และaskubuntu.com/a/178242/18306
jlliagre

11

tmuxมีความสามารถนี้ (พร้อมกับความสามารถที่มีประโยชน์อื่น ๆ อีกมากมายในหลอดเลือดดำเดียวกัน)

สามารถทำได้ผ่าน:

:setw synchronize-panes on

โปรดอธิบายโดยย่อว่า tmux ทำเช่นนั้นได้อย่างไร - หรือวางลิงก์ ขอบคุณ!
eli

1
: setw synchronize-panes on
Michael Martinez

9

Multixterm

multixtermเครื่องมือในการเพิ่มรายชื่อก็เป็นหนึ่งที่เรียกว่า มันใช้xtermขั้ว คุณสามารถเรียกใช้เช่น:

$ multixterm

และอีกครั้งคุณจะถูกนำเสนอด้วย GUI

                                                         เอสเอสของกุย

จากนั้นคุณสามารถเริ่มหมุนxtermหน้าต่างโดยคลิกที่new xtermปุ่ม ตัวอย่างเช่นที่นี่ฉันเรียก 2 ถ้าคุณคลิกที่หน้าต่างหลักคุณสามารถเริ่มพิมพ์คำสั่งในหน้าต่างทั้งสองพร้อมกัน:

   เอสเอสของ xtems

keyboardcast

ดูเหมือนว่าจะมีเฉพาะใน Ubuntu เท่านั้นดูเหมือนว่าหลายตัวอักษร

สิ่งที่สกัดมา

วัตถุประสงค์ของ keyboardcast คือช่วยให้คุณสามารถส่งการกดแป้นไปยังหน้าต่าง X หลาย ๆ หน้าต่างพร้อมกัน สิ่งนี้ช่วยให้คุณสามารถควบคุมจำนวนเทอร์มินัลที่เชื่อมต่อกับโฮสต์ที่แตกต่างกัน แต่มีลักษณะคล้ายกันเพื่อวัตถุประสงค์ในการดูแลระบบ

คุณยังสามารถเลือกเทอร์มินัลที่ไม่ใช่ หากคุณใช้ความสามารถนี้อย่างสมเหตุสมผลฉันจะสนใจฟังมัน

โปรแกรมสามารถเลือก windows เพื่อส่งไปที่ใดก็ได้โดยจับคู่หัวเรื่อง (โดยใช้ซับสตริง) หรือโดยคลิกที่หน้าต่าง (ในวิธีที่คล้ายกับคุณลักษณะสกรีนช็อตของ GIMP)

โปรแกรมยังมีความสามารถในการวางไข่หลายอินสแตนซ์ของ gnome-terminal ที่รันคำสั่งเดียวในหลาย ๆ อาร์กิวเมนต์ (เช่นการเรียกใช้ 'ssh' บนโฮสต์หลาย ๆ ตัว) เทอร์มินัลคำพังเพยถูกเรียกด้วยโปรไฟล์ 'keyboardcast' ถ้ามีอยู่ (เช่นขนาดตัวอักษรของคุณอาจเล็กกว่า)


เสมียนลง! จดบันทึกแล้ว
runlevel0

ดูเหมือนว่าแป้นพิมพ์คาสต์เสียซึ่งน่าผิดหวัง
RJ


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

หน้าจอต้องใช้งานมากขึ้น


คุณสามารถขยายเพิ่มเติมเกี่ยวกับโซลูชันบนหน้าจอได้หรือไม่ สอดคล้องกับสิ่งที่ฉันต้องการมากขึ้น ...
Arpith

ทำไมไม่ใช่แค่tail -fไฟล์บันทึกแทนที่จะตั้งค่าหน้าจอเป็นร้อย
Lie Ryan

@ หน้าจอวางไข่หลายขั้วในหนึ่งเดียว หากคุณต้องการที่จะเห็นพวกเขาทั้งหมดใน "เรียลไทม์" จากนั้นคุณสามารถใช้หน้าจอ แม้ว่าโดยส่วนตัวแล้วฉันจะไปกับ logfiles คุณสามารถตั้งค่า prog ของคุณเพื่อส่งข้อความหรือมี prog ของคุณเองเขียน logfile สำหรับแต่ละอินสแตนซ์ (เช่น: myprog.pid.log)
BitsOfNix

@LieRyan เพราะถ้าคุณไม่ได้เข้าสู่ระบบด้วยบางสิ่งบางอย่างเช่น syslog คุณต้องเข้าสู่ระบบไฟล์แยกต่างหากสำหรับแต่ละกระบวนการ หากคุณเพียงแค่พยายามให้กระบวนการ 20 + เขียนไปยังไฟล์เดียวกันในเวลาเดียวกันคุณจะมีเวลาที่ไม่ดี
Sammitch

@ Samammitch:tail -f *.log
Lie Ryan

5

ฉันเป็นผู้ใช้ KDE โดยมี konsole 2.13.2 ใน KDE 4.13.3 คุณสามารถทำได้:

  1. konsole เปิด

  2. มุมมองแยกในแนวตั้ง ป้อนคำอธิบายรูปภาพที่นี่

  3. เขียนพร้อมกันในแต่ละสถานีภายในหน้าต่าง ป้อนคำอธิบายรูปภาพที่นี่


4

ลองใช้ Terminator (เทอร์มินัลอีมูเลเตอร์) มันสามารถมีเชลล์ได้หลายเซสชันในหน้าต่างเดียวกันและคุณสามารถออกอากาศคำสั่งให้กับทุกคนได้

Terminator


3

คุณสามารถใช้เครื่องมือเช่น MobaXterm และมันจะช่วยให้คุณเชื่อมต่อพร้อมกันจากนั้นวางคำสั่งลงในหน้าต่างทั้งหมดของคุณ


ไม่เกี่ยวข้องกับ Linux เช่นเดียวกับ mobaxterm ซึ่งน่าประทับใจอย่างมากสำหรับสิ่งที่มันทำคือ Windows เท่านั้นและคำถามนี้ชัดเจนเกี่ยวกับโซลูชัน Linux
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กระบวนการที่มีพื้นหลังและพิมพ์shpid ของกระบวนการลูกเพื่อให้คุณสามารถตรวจสอบได้และลูก ๆ ของมันในขณะที่มันทำงาน


2

@ Jinpeng มาถูกทางด้วยGNU Parallelไม่ใช่แค่การนำไปใช้

ตัวอย่าง: รัน 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}

หากโปรแกรมของคุณสร้างข้อความ stdout ใด ๆ และคุณต้องการที่จะเห็นพวกเขาในขณะที่พวกเขาถูกสร้างขึ้น (แทนที่จะเริ่มต้นที่จะ collates พวกเขา) --ungroupตัวเลือกในการขนานอาจมีประโยชน์

parallel --ungroup   ...

หากคุณใช้งานเธรดจำนวนมากจากเวิร์กสเตชันของคุณและไม่ต้องการให้สิ่งใดไม่ตอบสนองให้พิจารณาniceทรีย่อยกระบวนการทั้งหมดในเวลาเปิดตัว

nice -n19 parallel   ...

สังเกตด้าน GNU ขนานมักจะไม่ได้ติดตั้งโดยค่าเริ่มต้น แต่มักจะอยู่ในแพคเกจ Repos ปกติของคุณดังนั้นเพียงแค่ติดตั้งเช่นแพคเกจอื่น ๆ : 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

จะทำให้การตั้งค่า terminator (แง่ของรูปแบบ) สำหรับหลาย ๆ หน้าต่างในกลุ่มเดียว

แก้ไข: อย่างน้อยที่สุดเทอร์มิเนเตอร์สามารถส่งสัญญาณออกอากาศไปยังทุกเครื่องในกลุ่มเดียวกัน ฟังก์ชั่นนี้สามารถสับเปลี่ยนได้ - ดังนั้นคุณสามารถเปิดใช้งานการเขียน 'su -' จากนั้นปิดการใช้งานและเขียนรหัสผ่านที่เป็นหนี้ไปยังเทอร์มินัล onces และเปิดใช้งานอีกครั้ง


1
มันจะดีกว่า ขอโทษนะไม่สบายภาษาอังกฤษโปรด :)
มาเร็ค
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.