![bash + 보조 스크립트와 메인 스크립트를 동시에 종료하는 방법](https://linux55.com/image/125747/bash%20%2B%20%EB%B3%B4%EC%A1%B0%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%99%80%20%EB%A9%94%EC%9D%B8%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EB%8F%99%EC%8B%9C%EC%97%90%20%EC%A2%85%EB%A3%8C%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
script1
우리는 다음에서 스크립트를 실행합니다.script_main
script_main
:
#!/bin/bash
/tmp/script1
echo $?
sleep 2
echo script ended
script1
:
#!/bin/bash
exit 1
분명히 script1
종료 코드는 1이지만 기본 스크립트는 끝까지 계속 실행됩니다.
내 질문: 언제 script1
즉시 exit 1
중지 할 수 있나요 main_script
?
답변1
가장 간단한 방법은 exit
다른 스크립트가 실패할 때 첫 번째 스크립트를 명시적으로 사용하는 것입니다. 조건에 스크립트 실행을 넣습니다.
otherscript.sh || exit 1
또는
if ! otherscript.sh ; then
ret=$?
echo "otherscript failed with exit code $ret. exit." >&2
exit 1
fi
이렇게 하면 기본 스크립트가 원하는 정리를 수행하거나 하위 프로세스의 종료 코드에 따라 다른 솔루션을 시도할 수 있습니다. 첫 번째에서는 || exit
just , 를 사용하여 하위 프로세스의 종료 코드를 전달할 수 있습니다.
기본 스크립트를 종료하려면어느명령이 시작되지 않고 set -e
.
set -e
otherscript.sh
echo "this will not run if otherscript fails"
set -e
조건부 구조 내에서 실행되는 프로그램에서는 작동하지 않으므로 특정 코드를 테스트하거나 오류를 무시하도록 추적할 수 있습니다 || true
. 그러나 이제 종료 지점이 어디에나 있으므로 trap somecmd EXIT
쉘이 종료되기 전에 어디서 발생하더라도 정리 작업을 수행할 수 있습니다.
내부 스크립트를 사용하여 기본 스크립트를 강제로 종료하는 것도 가능하지만 이는 약간 비우호적이며 일반적인 응용 프로그램에서는 이를 수행할 것으로 기대하지 않습니다. 그러나 원하는 경우 내부 스크립트가 단순히 상위 프로세스를 촬영하도록 하는 것도 한 가지 방법입니다.
$ cat mainscript.sh
#!/bin/bash
./otherscript.sh
echo "$0 exiting normally"
$ cat otherscript.sh
#!/bin/bash
echo "$0 kill $PPID"
kill $PPID
$ bash mainscript.sh
./otherscript.sh kill 11825
Terminated
여기에서 대화형 셸에서 실행하면 otherscript.sh
대화형 세션을 캡처하려고 시도합니다. SIGTERM
그러나 내가 테스트한 모든 쉘은 대화식으로 실행될 때 이를 무시하는 것 같습니다. 그럼에도 불구하고 메인 쉘은 다시 trap
사용할 수 있습니다 SIGTERM
.
kill 0
단순히 상위 프로세스를 잡는 대신 실행 중인 프로세스 그룹의 모든 프로세스를 종료하는 방법을 사용할 수 있습니다 otherscript.sh
. 비대화형 쉘에서 실행되는 경우 일반적으로 상위 프로세스가 포함됩니다.
답변2
소스를 사용할 수 있습니다 script 2
. 좋다:
. /tmp/script1.sh
종료 코드를 읽어 script2
프로세스를 종료합니다.
➜ /tmp cat script.sh
#!/bin/bash
echo "Running ${0} with pid $$"
. /tmp/script1.sh
echo $?
echo "This code won't execute"
sleep 2
echo "Script ${0} ended"
echo "This code won't execute"
sleep 2
echo "Script ${0} ended"
➜ /tmp cat script1.sh
#!/bin/bash
echo "Running ${0} with pid $$"
exit 5
실행하세요:
➜ /tmp ./script.sh
Running ./script.sh with pid 10306
Running ./script.sh with pid 10306
➜ /tmp echo $?
5