Shell 스 크 립 트 에서 신호 처리 실천

1969 단어 shell시그 널
케이스
실행 중인 스 크 립 트 를 멈 춰 야 할 때 가 있 습 니 다. Kill - 9 < pid > 방식 (즉, 신 호 를 보 내 는 SIGKILL) 으로 프로 세 스 를 죽 일 때 가 있 습 니 다. 스 크 립 트 를 우아 하 게 종료 하 는 방법 을 찾 아야 합 니 다.
해결 방안
셸 스 크 립 트 는 내 장 된 trap 명령 을 통 해 자신의 신호 처리 함 수 를 맞 출 수 있 습 니 다. 즉, 현재 프로 세 스에 보 내 는 신 호 를 포착 하고 시스템 의 기본 함수 가 아 닌 정 의 된 함 수 를 실행 할 수 있 습 니 다.조심 하 세 요. SIGKILL 은 잡 을 수 없습니다. 왜 죠?시스템 은 항상 프로 세 스 를 끝 내 는 수단 을 남 겨 야 하기 때문이다. 그렇지 않 으 면 모든 신호 가 잡 히 지만 바로 나 오지 않 으 면 이 프로 세 스 는 죽 일 수 없다.
trap 명령 형식 은 다음 과 같 습 니 다:
그 중 commandlist 는 명령 목록 입 니 다. 함 수 를 포함 하여 신호 목록 에 포 함 된 신 호 를 받 은 후에 실행 할 수 있 습 니 다.시그 널 스 는 포착 할 신호 의 목록 이다.
예 를 들 면:
SIGINT 캡 처, 메시지 출력 후 종료, 사용
trap 'command_list' signals

SIGINT 캡 처, 아무것도 하지 않 음, 즉 이 신 호 를 무시 하고 사용
trap 'echo you hit Ctrl-C\, now exiting..; exit' SIGINT

SIGINT 리 셋, 시스템 기본 신호 처리 함수 사용
trap '' SIGINT

이 예 에서 SIGTERM 신 호 를 포착 하고 신호 처리 함 수 를 지정 하여 자원 청 소 를 실현 할 수 있 으 며 자원 청 소 를 깨끗이 한 후에 종료 할 수 있 습 니 다.
이루어지다 
trap - SIGINT

운행 하 다.
horen@heart$~> cat signal.sh 
#!/bin/bash

trap 'TaskClean; exit' SIGTERM

function TaskOne()
{
   echo "Now do task one..."
   sleep 10
   echo "TaskOne is done"
}

function TaskTwo()
{
   echo "Now do task two..."
   sleep 10
   echo "TaskTwo is done"
}

function TaskClean()
{
   echo "Now do task clean..."
   sleep 2
   echo "TaskClean is done"
}


TaskOne
TaskTwo

TaskOne 을 실행 할 때 스 크 립 트 에 신호 SIGTERM 을 보 냅 니 다. 스 크 립 트 는 'sleep' 을 실행 하고 sleep 이 끝 날 때 신호 처리 함 수 를 실행 합 니 다.TaskOne 이 끝 난 후에 신호 처리 함 수 를 실행 하 는 것 이 아 닙 니 다. 
기타
이 예 에서 이상 한 문제 에 부 딪 혀 잠시 알 지 못 했다.
SIGTERM 신 호 를 포착 하지 않 으 면 스 크 립 트 가 이 신 호 를 받 았 을 때 시스템 기본 신호 처리 함 수 를 즉시 실행 합 니 다.
SIGTERM 신 호 를 캡 처 하고 신호 처리 함 수 를 지정 하면 스 크 립 트 가 이 신 호 를 받 았 을 때 현재 task 를 완성 하고 신호 처리 함 수 를 실행 합 니 다.

좋은 웹페이지 즐겨찾기