여러 명령을 함께 실행하고 그 중 하나가 종료되면 완료하시겠습니까?

여러 명령을 함께 실행하고 그 중 하나가 종료되면 완료하시겠습니까?

웹사이트 개발 중에 Django 개발 서버, "watch" 모드의 SCSS->CSS 컴파일러 등 여러 명령을 연속적으로 실행했습니다. 애플리케이션을 개발하고 실행하는 동안 모두 함께 실행하고, 필요할 때 중지하고, 콘솔에서 출력(예: 액세스 로그, 디버그 인쇄)을 검사할 수 있는 편리한 명령을 갖고 싶습니다.

그 중 하나가 충돌할 때 전체 명령이 종료되도록 하려면 어떻게 해야 합니까?

나는 다음과 같은 것을 생각하고 있었다다중 꼬리또는 tmux이지만 여전히 모니터링 및 종료 부분이 누락되었습니다. 직접 작성해야 합니까, 아니면 이미 사용 사례에 적합한 솔루션이 있습니까?

저는 리눅스(우분투)를 사용하고 있습니다.

답변1

set -e이를 수행하려면 쉘 스크립트를 사용할 수 있습니다 . 이를 사용할 때 명령이 0이 아닌 종료 상태를 반환하면 스크립트가 중단됩니다. 그러나 약간의 뉘앙스가 있습니다. 자세한 내용은 여기에서 확인할 수 있습니다.http://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html

예:

#!/bin/bash

set -e
echo this will print
cat -z this is a malformed command which will return non-0
echo this will not print

산출:

$ bash /tmp/test.sh 
this will print
cat: invalid option -- 'z'
Try 'cat --help' for more information.

$

답변2

모든 명령을 쉘 스크립트에 넣고 'set -e'를 사용하는 것은 어떻습니까? 0이 아닌 반환 코드를 받으면 즉시 스크립트가 종료됩니다.

답변3

Bash 스크립트에서는 를 사용하여 백그라운드에서 여러 프로세스를 실행 &하고 를 사용하여 프로세스 중 하나가 종료될 때까지 기다릴 수 있습니다 wait -n. trap키보드에서 서명 ctrl-c하고 이를 사용하여 프로세스를 종료할 수도 있습니다 . 이 예에서는 2개의 sleep 명령을 실행하고 하나가 종료되면 다른 하나가 종료됩니다. 키보드를 통해 스크립트를 중단하면 두 절전 모드가 모두 종료됩니다.

#!/bin/bash
myexit(){
    kill -1 $pids
    exit $rc
} 
pids= rc=1
trap myexit 1 2

sleep 5 &
pids="$pids $!"
sleep 10 &
pids="$pids $!"

wait -n
rc=$?
myexit

관련 정보