웹사이트 개발 중에 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