3개의 쉘을 열고 프로그램을 하나씩 실행하도록 설정했습니다.
cd foo/bar
./foo.sh
cd foo/bar
node bar.js
cd foo/bar
ruby foobar.rb
그러나 시간이 많이 걸리기 때문에 이를 수행하기 위한 쉘 스크립트를 작성했습니다.
cd foo/bar
./foo.sh &
node bar.js &
ruby foobar.rb
그러나 CTRL-C를 눌러 스크립트를 중지하면 다른 2개의 프로그램이 계속 실행 중입니다. 내가 들어가면
jobs
백그라운드 프로세스는 표시되지 않습니다(아마도 스크립트에 속함). 그렇다면 해당 fg
프로세스를 전경으로 가져와서 하나씩 CTRL-C를 누를 수 있으므로 이렇게 해야 합니다.
ps ax | grep foo
ps ax | grep bar
프로세스 ID를 찾아 프로세스를 종료합니다.
자동으로 3개의 셸을 열고 3개의 프로그램을 실행하여 3개의 셸을 열고 실행하는 것처럼 동작하도록 하는 더 좋은 방법이 있습니까? 나는 STDOUT 출력에 관심이 없으므로 쉘 창이 세 부분으로 분할되어도 괜찮습니다.
tmux, emacs 또는 다른 도구가 이를 달성할 수 있습니까? (나는 이것이 가능한지 알기에는 tmux나 emacs에 너무 익숙하지 않습니다.)
답변1
귀하의 주요 질문에 대한 답변은 아니지만(저는 screen
사용자이고 으로 이동할 필요성을 느낀 적이 없습니다 tmux
) 다음 사항에 대한 의견입니다.
그러나 시간이 더 많이 걸리기 때문에 이를 수행하기 위한 쉘 스크립트를 작성했습니다.
cd foo/bar ./foo.sh & node bar.js & ruby foobar.rb
그러나 CTRL-C를 눌러 스크립트를 중지하면 다른 2개의 프로그램이 계속 실행 중입니다.
비대화형 셸에서 이 작업을 수행하면 셸은 cmd &
실행 프로세스에 대한 POSIX 요구 사항을 따라 SIGINT 및 SIGQUIT 신호 처리를 "무시"로 설정합니다. 이는 +가 해당 신호를 종료하지 않는 이유를 설명합니다.cmd
Ctrlc
그러나 zsh, bash, mksh 및 yash(이 명령을 무시하는 dash, ksh93, bosh 제외 trap
)를 포함한 여러 셸에서는 다음 명령을 사용하여 이러한 신호의 기본 구성을 복원할 수 있습니다.
#! /bin/zsh -
cd foo/bar || exit
(trap - INT QUIT; ./foo.sh) &
(trap - INT QUIT; node bar.js) &
ruby foobar.rb
wait
그러면 Ctrl+는 c비동기적으로 시작된 명령도 종료합니다.