Aynı linux komutunu aynı anda birden fazla sekme / kabukta nasıl çalıştırabilirim?


33

Linux'ta aynı anda birden fazla sekmede komut çalıştırmak için kullanabileceğim herhangi bir araç / komut var mı? Aynı komutu çalıştırmak istiyorum: Aynı ./myprog argument1 argument2anda birden fazla kabukta, mutekslerin iş parçacıklı bir programda iyi çalışıp çalışmadığını kontrol etmek için. Kodumu daha sonra strese sokmak için bu programın örnek sayısını artırabilmek istiyorum.

Duvarın yaptığı gibi bir şey arıyorum. Tty'leri kullanmayı düşünebilirim, ancak bunu daha fazla kabuğa ölçeklendirmek zorunda kalırsam bu çok acı gibi görünüyor.


1
"Kendini bir bilgisayarı içeren tekrarlayan bir işle bulursan, otomatikleştir" - ben . Yük testi için çoklu terminal sekmeleri kullanarak kendinize bir kötülük yapıyor olabileceğinizi düşünüyorum çünkü sıkıcı olan her şeyi izlemeniz gerekecek. Alt myprogörneklerin ortaya çıkmasına neden olan ve sizin için çıktılarını toplayan bir programın olması daha iyidir .
msw

1
Normal çoklu iş parçacığı işlemler arasında bir muteks olmayacak ...?
Aaron D. Marasco

@msw: Evet, peki ya son kullanıcının aynı komutu terminalinden çalıştırdığında ne olacağını görsem ve bunu 100 olarak söylemesi gerektiğinde, ekranda ne göreceklerdi? Bu belirlenecek geçerli bir şey değil mi?
Arpith

@ AaronD.Marasco: İçine koyduğum mutekseleri kullanıcı alanında kontrol etmek istiyorum.
Arpith

Öyleyse bir süpervizörün altında 99 örnek çalıştırın ve terminalde 100'üncü çalıştırın. Aynı anda 100 terminali izleyebileceğinizi kabul ediyorum, öyleyse etkilendim.
msw

Yanıtlar:


46

Mavillan'ın daha önce de önerdiği gibi, sadece sonlandırıcı kullanın . Birçok terminali döşenmiş bir şekilde görüntülemenizi sağlar. Yayın özelliğini etkinleştirirken, her bir terminalde aynı komutu aynı anda girebilirsiniz.

İşte tarih komutunun 32 terminalden oluşan bir ızgaraya yayınlanmış bir örneği.

terminatorx32


3
Kahretsin, bu harika!
Afr

32 terminali nasıl kolayca açabilirim?
Annan

6
@Annan Terminator özel mizanpajları destekler, unix.stackexchange.com/a/168445/2594 ve askubuntu.com/a/178242/18306
15:15

11

tmux bu yeteneğe sahiptir. (aynı damardaki diğer birçok faydalı özellik ile birlikte)

İle yapılabilir:

:setw synchronize-panes on

Bunun nasıl tmux olduğunu - ya da bir bağlantıyı yapıştırır mısınız? Teşekkürler!
eli

1
: üzerine setw senkronize-bölmeleri
Michael Martinez

9

Multixterm

Listeye eklemek için başka bir araç denir multixterm. xtermTerminalleri kullanır . Öyle çağırabilirsin:

$ multixterm

Bir kez daha bir GUI ile size sunulacak.

                                                         gui ss

Daha sonra düğmesine xtermtıklayarak pencereleri açmaya başlayabilirsiniz new xterm. Burada örneğin 2'yi çağırdım. Eğer ana pencereye tıklarsanız, komutları her iki pencereye aynı anda yazmaya başlayabilirsiniz:

   xtems ss

keyboardcast

Sadece Ubuntu'da mevcut görünüyor, multixterm'e benziyor.

alıntı

Klavye yayınının amacı, aynı anda birden fazla X penceresine tuş vuruşlarını göndermenizi sağlamaktır. Bu, örneğin, kitle yönetimi amacıyla farklı ancak benzer ana bilgisayarlara bağlı birkaç terminali kontrol etmenizi sağlar.

Ayrıca terminal olmayanları da seçebilirsiniz. Bu yetenek için makul bir kullanım bulursanız, duymak isterim.

Program, başlıklarını eşleştirerek (alt dize kullanarak) veya üzerlerine tıklayarak (GIMP'nin ekran görüntüsü özelliğine benzer bir yöntemde) göndermek için pencereleri seçebilir.

Program ayrıca, birden fazla argüman üzerinde tek bir komut yürüten birden fazla gnome-terminal örneği oluşturma yeteneği de sunmaktadır (örneğin, birkaç ana bilgisayarda 'ssh' yürütmek). Gnome-terminalleri, eğer mevcutsa 'keyboardcast' profiliyle çağrılır (bu nedenle, yazı tipi boyutunuz daha küçük olabilir).


onundur! Not alındı.
runlevel0

Klavye yayını bozuldu, bu da hayal kırıklığı yaratıyor.
RJ,


8

Gibi bir şey yapabilirsiniz:

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

Veya her komutun çıktısı yürütme sırasında ilgiliyse, ekranı ayarlayabilirsiniz.

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

Ekran daha fazla manuel çalışma gerektirir.


Ekran çözümünde daha fazla genişletir misiniz?
İstediklerime göre

neden sadece tail -fyüzlerce ekran ayarlamak yerine sadece günlük dosyası değil.
Lie Ryan,

@Elektronik ekranlar tek bir tanede birçok terminali oluşturur. Hepsini "gerçek zamanlı" görmek istiyorsanız o zaman ekranı kullanabilirsiniz. Her ne kadar kişisel olarak logfile ile girsem de, mesaj göndermek için progunuzu ayarlayabilir veya aslında her örnek için bir logfile yazan bir prog yazabilirsiniz (örneğin: myprog.pid.log)
BitsOfNix

@ LieRyan çünkü syslog gibi bir şeyle giriş yapmazsanız, her işlem için ayrı bir dosyaya giriş yapmanız gerekir. Eğer sadece 20'den fazla işlemin aynı dosyaya aynı anda yazmasını denerseniz, kötü bir zaman geçirirsiniz.
Sammitch

@Sammitch:tail -f *.log
Lie Ryan

5

Ben KDE kullanıcısıyım, KDE 4.13.3'deki konsole 2.13.2 ile bunu yapabilirsiniz:

  1. açık konsole

  2. görünümü dikey olarak bölme görüntü tanımını buraya girin

  3. pencerenin içindeki her bir terminale aynı anda yazın görüntü tanımını buraya girin


4

Terminator'ü (emülatör terminali) deneyin. Aynı pencerede birçok kabuk oturumu olabilir ve hepsine bir komut yayınlayabilirsiniz.

terminatör


3

MobaXterm gibi bir araç kullanabilirsiniz; aynı anda bağlanmanıza ve ardından komutlarınızı tüm pencerelerinize yapıştırmanıza izin verir.


Linux ile ilgili değil, mobaxterm olarak, yaptıkları şey için çok etkileyici olan yalnızca Windows'tur ve soru açıkça bir Linux çözümü ile ilgilidir.
RJ,

3

Yalnızca 100. programın yürütülmesinden çıktı almak istiyorsanız:

#!/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

Sen kontrol edebilirsiniz konsoleyoluyla DCOP. Buradan bir örnek :

#!/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'nin yukarıdaki yorumuna katılıyorum. Bu, size arka planlı bir shişlem tarafından başlatılacak bir komut dosyası yazacak ve alt shişlemin ücretini yazdıracak ;


2

@ Jinpeng sadece uygulamada değil, GNU Parallel ile doğru yoldaydı .

Örnek: Programınızın 10 paralel örneğini çalıştırın, her iş parçacığı yalnızca bir kez programınızı çalıştırıyorsa:

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

Örnek: 10 paralel iş parçacığı çalıştırın.

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

10Örneklerimin yerini alarak bunu kolayca yüzlerce iş parçacığına ölçeklendirebilirsiniz .

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

Programınız herhangi bir stdout mesajı üretiyorsa ve onları üretilirken görmek istiyorsanız (bunları harmanlayan varsayılan yerine), --ungroupparalel seçeneği yararlı olabilir.

parallel --ungroup   ...

İş istasyonunuzdan çok fazla iş parçacığı kullanıyorsanız ve işlerin tepkisizleşmesini istemiyorsanız nice, tüm işlem alt ağacını başlatma zamanında kullanmayı düşünün .

nice -n19 parallel   ...

: Yan not, GNU Paralel böylece herhangi bir diğer paket gibi kurun genellikle varsayılan olarak yüklenmez ancak normal paket depolarındakii genellikle edilir dnf install parallel, apt-get install parallel, brew install parallelvb


1

İşlemleri arka planda ile başlatabilirsiniz nohup.

Örnek:

nohup ./myprog -arg1 -arg2 &

Çıktı:

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

Daha sonra verilenlerle görevi öldürmeyi unutmayın PID:

kill 1769

İşlemi ön plana getirmek için bu durumda iş numarasına girmelisiniz [1]:

fg %1

1

Gnu paralel tam olarak aradığınız araçtır. parallel -j 9 yourcommand


0

Benim küçük değirmen:

#!/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

Bir gruptaki birçok pencere için terminator config (düzen terimleri) yapacaktır.

EDIT: En azından, terminatör aynı gruptaki her terminale yayın gönderebilir. Bu işlev değiştirilebilir - böylece 'su -' yazmasını etkinleştirebilir, onces şifresini onces terminallerine yazıp tekrar etkinleştirebilirsiniz.


1
Daha iyi mi? Afedersiniz İngilizce rahatsız
Marek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.