Як запустити одну і ту ж команду Linux на більш ніж одній вкладці / оболонці одночасно?


33

Чи є якийсь інструмент / команда в Linux, яку я можу використовувати для запуску команди на більш ніж одній вкладці одночасно? Я хочу запустити одну і ту ж команду: ./myprog argument1 argument2одночасно в більш ніж одній оболонці, щоб перевірити, чи працюють мутекси в непорядковій програмі. Я хочу мати змогу збільшити кількість примірників цієї програми, щоб згодом поставити свій стрес.

Я ніби шукаю щось на кшталт того, що робить стіна. Я можу подумати про використання tty's, але це просто здається сильним болем, якщо мені доведеться масштабувати це до багатьох інших снарядів.


1
"Кожен раз, коли ви виявите, що виконуєте завдання, що повторюється, що включає комп'ютер, автоматизуйте його", - мені . Я думаю, що ви можете робити собі загрозу, використовуючи кілька вкладок терміналів для тестування навантажень, тому що вам доведеться дивитися на них все, що нудно. Краще мати одну програму, яка породжує дочірні myprogекземпляри та агрегує їх результати для вас.
msw

1
Звичайна багатопотокова різниця не матиме файлу між процесами ...?
Аарон Д. Мараско

@msw: Так, але що, якби я хотів побачити, що бачить кінцевий користувач, коли він запускає ту саму команду зі свого терміналу і коли я масштабую це, щоб сказати 100, що вони побачать на своєму екрані? Хіба це не правдива річ для визначення?
Арпіт

@ AaronD.Marasco: Я хочу перевірити вбудовані мютекси в просторі користувача.
Арпіт

Тому запустіть 99 екземплярів під одним супервізором і запустіть 100-ту в терміналі. Я визнаю, що ви, можливо, зможете переглядати 100 терміналів одночасно, якщо це так, я вражений.
msw

Відповіді:


46

Як вже запропонував mavillan, просто використовуйте термінатор . Це дозволяє відображати багато терміналів плитковим способом. Увімкнувши функцію мовлення, ви можете одночасно вводити ту саму команду на кожному терміналі.

Ось приклад із командою дати, що транслюється в сітку з 32 терміналів.

термінаторx32


3
Чорт, це дивовижно!
Афр

Як я можу легко відкрити 32 термінали?
Анан

6
@Annan Terminator підтримує власні макети, ознайомтесь з unix.stackexchange.com/a/168445/2594 та askubuntu.com/a/178242/18306
jlliagre

11

tmux має цю можливість. (разом з багатьма іншими корисними можливостями в тій самій дузі)

Це можна зробити через:

:setw synchronize-panes on

Ви можете коротко описати, як це робить tmux - або вставити посилання? Дякую!
eli

1
: встановити панелі синхронізації
Michael Martinez

9

Multixterm

Ще один інструмент для додавання до списку - це названий multixterm. Він використовує xtermтермінали. Ви можете викликати його так:

$ multixterm

І як тільки ви побачите, вам буде представлений графічний інтерфейс.

                                                         ss gui

Потім ви можете почати відкручувати xtermвікна, натиснувши new xtermкнопку. Ось, наприклад, я посилався на 2. Якщо натиснути на первинне вікно, ви можете почати вводити команди в обох вікнах одночасно:

   ss xtems

клавіатури

Здається, доступний лише на Ubuntu, схожий на мультитертерм.

витяг

Призначення клавіатури - дозволити надсилати натискання клавіш на декілька вікон X одночасно. Це дозволяє, наприклад, керувати низкою терміналів, підключених до різних, але схожих хостів для цілей масового адміністрування.

Ви також можете вибрати нетермінали. Якщо ви знайдете розумне використання цієї здатності, мені було б цікаво почути про це.

Програма може вибрати вікна, на які потрібно надіслати, шляхом зіставлення їх заголовків (за допомогою підрядки) або натисканням на них (методом, подібним до функції скріншоту GIMP).

У програмі також є можливість нереалізувати декілька екземплярів gnome-terminal, виконуючи одну команду з декількох аргументів (наприклад, виконуючи 'ssh' на декількох хостах). Термінали gnome викликаються профілем "клавіатура", якщо він існує (так, наприклад, розмір шрифту може бути меншим).


зберігачі! Примітка зроблена.
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

Екран вимагає більше ручної роботи.


Чи можете ви розширити більше на екрані рішення? Більше відповідно до того, що я хочу ...
Арпіт

чому б не просто tail -fфайл журналу, а не встановити сто екранів.
Lie Lie Ryan

@Arpith екран породжує кілька терміналів в одному. Якщо ви хочете побачити їх у режимі реального часу, тоді ви можете скористатися екраном. Хоча особисто я пішов би з реєстраційними файлами, ви можете налаштувати свою програму, щоб надіслати повідомлення або насправді мати власну програму написання журналу файлів для кожного примірника (наприклад: myprog.pid.log)
BitsOfNix

@LieRyan тому, що якщо ви не входите в систему, як-от syslog, для кожного процесу потрібно увійти в окремий файл. Якщо ви просто спробуєте мати 20+ процесів, запишіть у той самий файл одночасно, вам буде погано.
Саммітч

@Sammitch:tail -f *.log
Lie Ryan

5

Я користувач KDE, з konsole 2.13.2 на KDE 4.13.3 ви можете це зробити:

  1. відкрита консоль

  2. розділений вид вертикально введіть тут опис зображення

  3. пишіть одночасно на кожному терміналі всередині вікна введіть тут опис зображення


4

Спробуйте 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процесом і роздрукує підопічний дочірній shпроцес, щоб ви могли стежити за ним та його дітьми, як він працює.


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, і ви хочете бачити їх такими, які вони виробляються (а не за замовчуванням, що їх згортає), --ungroupможе бути корисним паралельний параметр.

parallel --ungroup   ...

Якщо ви працюєте з великою кількістю потоків зі своєї робочої станції і не хочете, щоб речі не відповідали, розгляньте niceпіддерево всього процесу під час запуску.

nice -n19 parallel   ...

Примітка боку, GNU 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

Зробить конфігурацію термінатора (терміни макета) для багатьох вікон в одній групі.

EDIT: Принаймні, термінатор може надсилати трансляцію до кожного терміналу в одній групі. Ця функція є комутаційною, тому ви можете дозволити їй писати «su -», а потім вимкнути та записати власний пароль до терміналів onces і включити його знову.


1
Чи краще? Вибачте, будь ласка, англійську, будь ласка :)
Марек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.