쉘 스크립트가 스스로 종료되는 이유는 무엇일까요?

쉘 스크립트가 스스로 종료되는 이유는 무엇일까요?

이와 같은 쉘 스크립트가 있습니다

#!/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참조 ) 명령이 오류와 함께 종료됩니다.SHELLOPTSbash
  • 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 

관련 정보