이와 같은 쉘 스크립트가 있습니다
#!/bin/bash
while true;do
#Code HERE!
#Pushing Data to DB
echo "Data to DB"> /root/schip.log 2>&1
done
스크립트는 지속적으로 실행되어 서버에서 정보를 수집한 다음 데이터를 데이터베이스(타임스탬프 데이터베이스)로 보냅니다. 왜 그런지 모르겠습니다. 때로는 스크립트가 죽기도 합니다. 로그에서 아무것도 볼 수 없습니다. 마찬가지로 Python 스크립트에서도 이를 볼 수 있습니다. Python 스크립트는 다음과 같습니다.
import <stuff>
while True:
#Code HERE
#Push data to DB
print "Data to DB"
그렇다면 원인은 무엇일까요? 그것을 방지하는 방법? 그리고 그 이유를 이해하기 위해 어떻게 로깅(Python 및 Shell에서)을 활성화할 수 있습니까? 감사해요!
답변1
쉘이 종료될 수 있는 몇 가지 사항(완전하지는 않음):
- 유틸리티를 호출합니다
exit
. 당연한 사실을 잊지 말자 - 유틸리티를 호출합니다
return
. 이 경우bash
함수나 소스 파일 내에서만 반환됩니다. exec cmd
. 이는 동일한 프로세스에서 실행되므로cmd
실제로 루프가 중단됩니다.cmd
스크립트는 종료 시 종료됩니다.set -e
/가 활성화되고( 환경 변수set -o errexit
참조 ) 명령이 오류와 함께 종료됩니다.SHELLOPTS
bash
set -u
/set -o nounset
가 활성화되어 있고 설정되지 않은 변수를 참조합니다.- a
DEBUG
또는ERR
트랩은 call 로 정의됩니다exit
. - 실패하다특별한내장된 기능. 특수 내장 함수(예
set
: ,:
,eval
...)가 실패하면 쉘이 종료됩니다. 하지만 이 경우bash
이는 POSIX 모드에서만 발생하며(예:sh
환경에서 POSIXLY_CORRECT가 호출되는 경우...) 모든 특수 내장 함수에 대해서도 발생하지 않습니다. 예를 들어: > /
쉘이 종료됩니다. - ~처럼@schily가 언급함, 구문 오류(조건만 충족되는 코드에서와 같이).
$((1/x))
0( 또는 ) 으로 나눕니다${array[1/x]}
.bash
예를 들어 특정 한도에 도달하면 내부 오류가 발생합니다.- 메모리 할당 실패
- 프로세스를 분기할 수 없습니다.
- 스택 크기가 초과되었습니다(예: 함수 재귀를 사용하는 경우).
- 다른한계통과됨
ulimit
(이로 인해 일부 신호가 전송될 수도 있음)
- 다른 프로세스에 의해 종료되었습니다. 다른 프로세스는
kill()
스크립트를 명시적으로 종료하는 인터프리터를 호출할 수 있습니다. - 시스템에 의해 살해되었습니다.
- 신호/신호 종료.
^C
/ 를 누르면^\
. - 한숨을 쉬다. 단말기 연결이 끊어진 경우.
- SIGSEGV/SIGBUS/SIGILL. bash 명령 실행 오류(오류) 또는 하드웨어(메모리) 오류입니다.
- SIGPIPE: 내장(
echo
,printf
)은 이제 닫힌 파이프나 소켓에 씁니다(stderr이 파이프인 경우 오류 메시지가 발생할 수도 있음).
- 신호/신호 종료.
가장 먼저 확인해야 할 것은 오류 메시지와 종료 상태입니다.
답변2
스크립트의 구문 오류로 인해 스크립트가 종료됩니다.
스크립트 코드에 특정 상황에서 공백이 포함될 수 있는 쉘 변수가 포함되어 있는 경우, 쉘 변수를 큰따옴표로 묶지 않으면 구문 오류가 발생할 수 있습니다.
답변3
어쩌면 쉘이 외부 코드를 얻기 위해 "."를 사용하고 있을 수도 있습니다. 주문하다.
이 코드는 동일한 쉘 인스턴스에 의해 해석됩니다. 코드에 구문 오류가 있거나 코드가 "종료"를 수행하는 경우 호출 스크립트가 중지됩니다. 모든 루프에서 스크립트가 호출되지 않을 수 있으므로 작업이 실패하기 전에 잠시 동안 실행됩니다.
3번의 루프 후에 실패하는 구문 오류가 있는 예
#!/bin/sh
i=3
while true
do
let i=i-1
[ $i -eq 0 ] && . ./a 2>/dev/null
sleep 2
done
'a' 스크립트에 'fi'가 누락되었습니다.
if true
then
echo a