둘 이상의 탭 / 쉘에서 동일한 Linux 명령을 동시에 실행하려면 어떻게합니까?


33

Linux에서 둘 이상의 탭에서 동시에 명령을 실행하는 데 사용할 수있는 도구 / 명령이 있습니까? 동일한 명령을 실행하고 싶습니다. ./myprog argument1 argument2하나 이상의 쉘에서 동시에 뮤텍스가 스레드 프로그램에서 제대로 작동하는지 확인합니다. 나중에 코드에 스트레스를주기 위해이 프로그램의 인스턴스 수를 늘릴 수 있기를 원합니다.

나는 벽이하는 것과 같은 것을 찾고 있습니다. 나는 tty를 사용하는 것을 생각할 수 있지만 이것을 더 많은 껍질로 확장해야한다면 그것은 많은 고통처럼 보입니다.


1
"컴퓨터와 관련된 반복적 인 작업을 수행 할 때마다 자동화하십시오."– . 지루한 것을 모두 봐야하기 때문에 부하 테스트에 여러 개의 터미널 탭을 사용하여 스스로 장애를 겪고 있다고 생각합니다. 자식 myprog인스턴스 를 생성 하고 결과를 집계 하는 하나의 프로그램을 사용하는 것이 좋습니다.
msw

1
일반적인 멀티 스레딩은 프로세스간에 뮤텍스를 갖지 않을 것입니다 ...?
Aaron D. Marasco

@ msw : 예. 그러나 최종 사용자가 터미널에서 동일한 명령을 실행했을 때 볼 수있는 것을보고 100으로 말하도록 스케일을 조정하면 화면에 무엇을 볼 수 있습니까? 결정하기에 타당하지 않습니까?
Arpith

@ AaronD.Marasco : 사용자 공간에 넣은 뮤텍스를 확인하고 싶습니다.
Arpith

따라서 한 감독자 하에서 99 개의 인스턴스를 실행하고 터미널에서 100 번째 인스턴스를 실행하십시오. 나는 당신이 100 개의 터미널을 동시에 볼 수 있다고 생각합니다. 그렇다면 감동합니다.
msw

답변:


46

mavillan 이미 제안한 것처럼, 단지 사용 터미네이터 . 많은 터미널을 바둑판 식으로 표시 할 수 있습니다. 방송 기능을 활성화하면 각 터미널에서 동시에 동일한 명령을 입력 할 수 있습니다.

다음은 date 명령이 32 터미널의 그리드로 브로드 캐스트 된 예입니다.

터미네이터 x32


3
젠장, 대단해!
Afr

32 개의 터미널을 쉽게 열 수 있습니까?
Annan

6
@Annan 터미네이터로보고 있고, 사용자 정의 레이아웃을 지원 unix.stackexchange.com/a/168445/2594askubuntu.com/a/178242/18306
jlliagre

11

tmux 에는이 기능이 있습니다. (동일한 정맥에서 다른 많은 유용한 기능과 함께)

다음을 통해 수행 할 수 있습니다.

:setw synchronize-panes on

tmux가 어떻게 작동하는지 간단히 설명하거나 링크를 붙여 넣을 수 있습니까? 고마워!
eli

1
: setw 동기화 패널
Michael Martinez

9

멀티 플렉스

목록에 추가 할 다른 도구는이라는 도구 multixterm입니다. xterm터미널을 사용합니다 . 다음과 같이 호출 할 수 있습니다.

$ multixterm

그리고 일단 당신은 GUI가 표시됩니다.

                                                         구이의 ss

그런 다음 버튼 xterm을 클릭하여 창 회전을 시작할 수 있습니다 new xterm. 예를 들어 여기에서 2를 호출했습니다. 그런 다음 기본 창을 클릭하면 두 창에서 동시에 명령 입력을 시작할 수 있습니다.

   xtems의 ss

키보드 캐스트

우분투에서만 사용할 수있는 것으로 보이며 multixterm과 유사합니다.

발췌

키보드 캐스트의 목적은 한 번에 여러 X 창에 키 입력을 보낼 수 있도록하는 것입니다. 예를 들어, 대량 관리를 위해 서로 다르지만 유사한 호스트에 연결된 여러 터미널을 제어 할 수 있습니다.

비 터미널을 선택할 수도 있습니다. 이 능력을 합리적으로 사용한다면 그것에 대해 듣고 싶습니다.

프로그램은 제목을 일치 시키거나 (하위 문자열을 사용하여) 클릭하거나 (GIMP의 스크린 샷 기능과 유사한 방법으로) 클릭하여 보낼 창을 선택할 수 있습니다.

이 프로그램은 또한 여러 인수에서 단일 명령을 실행하는 (예 : 여러 호스트에서 'ssh'실행) 그놈 터미널의 여러 인스턴스를 생성하는 기능도 갖추고 있습니다. gnome-terminals는 '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

@Arpith 화면은 하나의 터미널에 여러 터미널을 생성합니다. "실시간"으로 모든 것을 보려면 화면을 사용할 수 있습니다. 개인적으로 로그 파일을 사용 하겠지만, 각 인스턴스에 대해 로그 파일을 작성하여 메시지를 보내거나 실제로 자신의 프로그램을 만들도록 프로그램을 설정할 수 있습니다 (예 : myprog.pid.log)
BitsOfNix

@LieRyan syslog와 같은 것으로 로깅하지 않으면 각 프로세스마다 별도의 파일에 기록해야하기 때문입니다. 단순히 20 개 이상의 프로세스가 같은 파일에 동시에 쓰려고하면 시간이 나빠질 것입니다.
Sammitch

@Sammitch :tail -f *.log
거짓말 라이언

5

KDE 4.13.3의 konsole 2.13.2를 사용하는 KDE 사용자입니다.

  1. 열린 콘솔

  2. 세로로 분할 여기에 이미지 설명을 입력하십시오

  3. 창 안의 각 터미널에 동시에 쓰십시오 여기에 이미지 설명을 입력하십시오


4

터미네이터 (에뮬레이터 터미널)를 사용해보십시오. 같은 창에 많은 셸 세션이있을 수 있으며 모든 세션에 명령을 브로드 캐스트 할 수 있습니다.

터미네이터


3

MobaXterm과 같은 도구를 사용하면 동시에 연결 한 다음 명령을 모든 창에 붙여 넣을 수 있습니다.


mobaxterm과 같이 Linux와 관련이없는 것은 Windows에만 해당되며 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프로세스의 pid를 인쇄하여 작동하는 동안 해당 자식과 자식 을 모니터링 할 수 있습니다.


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 병렬는 그래서 그냥 다른 패키지처럼 설치, 일반적으로 기본적으로 설치되지하지만 일반 패키지의 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

1

gnu parallel은 정확하게 당신이 찾고있는 도구입니다. parallel -j 9 yourcommand


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

한 그룹의 많은 창에 대해 터미네이터 구성 (레이아웃 용어)을 만듭니다.

편집 : 적어도 터미네이터는 동일한 그룹의 모든 터미널에 브로드 캐스트를 보낼 수 있습니다. 이 기능은 전환 가능하므로 'su-'라고 쓴 다음 owen 암호를 비활성화하고 한 번 터미널에 쓰고 다시 활성화하십시오.


1
더 낫습니까? 실례합니다 영어 실례합니다 :)
Marek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.