Bash
신호 및 시스템 이벤트에 반응하는 "트랩"사용
수색…
통사론
- trap action sigspec ... # 신호 목록에서 "action"실행
- trap sigspec ... # 생략하는 동작은 신호에 대한 트랩을 재설정합니다.
매개 변수
매개 변수 | 의미 |
---|---|
-피 | 현재 설치된 트랩 나열 |
-엘 | 신호 이름 및 해당 번호 나열 |
비고
trap
유틸리티는 내장 된 특수 쉘입니다. POSIX에 정의되어 있지만 bash는 유용한 확장을 추가합니다.
POSIX 호환 #!/bin/sh
시작하는 예제와 #!/bin/bash
시작하는 예제는 bash 확장자를 사용합니다.
신호는 신호 번호, 신호 이름 (SIG 프리픽스 없음) 또는 특수 키워드 EXIT
중 하나 일 수 있습니다.
POSIX에 의해 보장되는 것들은 :
번호 | 이름 | 노트 |
---|---|---|
0 | 출구 | 종료 코드에 관계없이 항상 쉘 exit에서 실행 |
1 | SIGHUP | |
2 | SIGINT | 이것은 ^C 보내는 것입니다. |
삼 | SIGQUIT | |
6 | SIGABRT | |
9 | 알래스카 | |
14 | SIGALRM | |
15 명 | 시걸 | 이것은 kill 이 기본적으로 보내는 것입니다. |
SIGINT 또는 Ctl + C 잡기
트랩은 서브 쉘을 위해 리셋되므로 sleep
은 여전히 ^C
(보통 종료 함)에 의해 보내진 SIGINT
신호에서 작동하지만 부모 프로세스 (즉, 쉘 스크립트)는 그렇지 않습니다.
#!/bin/sh
# Run a command on signal 2 (SIGINT, which is what ^C sends)
sigint() {
echo "Killed subshell!"
}
trap sigint INT
# Or use the no-op command for no output
#trap : INT
# This will be killed on the first ^C
echo "Sleeping..."
sleep 500
echo "Sleeping..."
sleep 500
그리고 여전히 ^C
두 번 눌러 메인 프로그램을 종료 할 수있는 변형이 있습니다 :
last=0
allow_quit() {
[ $(date +%s) -lt $(( $last + 1 )) ] && exit
echo "Press ^C twice in a row to quit"
last=$(date +%s)
}
trap allow_quit INT
소개 : 임시 파일 정리
trap
명령을 사용하여 신호를 "트랩"할 수 있습니다. C 및 다른 대부분의 프로그래밍 언어에서 signal()
또는 sigaction()
호출과 동일한 쉘로 signal()
를 포착합니다.
trap
의 가장 일반적인 용도 중 하나는 예상치 못한 예기치 않은 종료시 임시 파일을 정리하는 것입니다.
불행히도 쉘 스크립트가 충분하지 않습니다 :-(
#!/bin/sh
# Make a cleanup function
cleanup() {
rm --force -- "${tmp}"
}
# Trap the special "EXIT" group, which is always run when the shell exits.
trap cleanup EXIT
# Create a temporary file
tmp="$(mktemp -p /tmp tmpfileXXXXXXX)"
echo "Hello, world!" >> "${tmp}"
# No rm -f "$tmp" needed. The advantage of using EXIT is that it still works
# even if there was an error or if you used exit.
출구에서 실행할 트랩 작업 목록을 누적하십시오.
임시 파일을 정리하거나 종료 할 때 다른 작업을 수행하는 trap
을 추가하는 것을 잊어 본 적이 있습니까?
다른 트랩을 취소 한 트랩을 설정 한 적이 있습니까?
이 코드를 사용하면 코드의 어딘가에 하나의 큰 trap
문을 사용하는 대신 한 번에 하나의 항목을 종료 할 때 수행 할 작업을 쉽게 추가 할 수 있으므로 잊기 쉽습니다.
# on_exit and add_on_exit
# Usage:
# add_on_exit rm -f /tmp/foo
# add_on_exit echo "I am exiting"
# tempfile=$(mktemp)
# add_on_exit rm -f "$tempfile"
# Based on http://www.linuxjournal.com/content/use-bash-trap-statement-cleanup-temporary-files
function on_exit()
{
for i in "${on_exit_items[@]}"
do
eval $i
done
}
function add_on_exit()
{
local n=${#on_exit_items[*]}
on_exit_items[$n]="$*"
if [[ $n -eq 0 ]]; then
trap on_exit EXIT
fi
}
종료시 하위 프로세스 종료
트랩 표현식은 개별 함수 또는 프로그램 일 필요는 없으며보다 복잡한 표현식이 될 수도 있습니다.
jobs -p
와 kill
을 조합함으로써 exit시 쉘의 생성 된 모든 하위 프로세스를 종료 할 수 있습니다.
trap 'jobs -p | xargs kill' EXIT
터미널 창 크기의 변화에 반응한다.
WINCH (WINdowCHange) 신호가 있습니다.이 신호는 터미널 창 크기를 조정할 때 발생합니다.
declare -x rows cols
update_size(){
rows=$(tput lines) # get actual lines of term
cols=$(tput cols) # get actual columns of term
echo DEBUG terminal window has no $rows lines and is $cols characters wide
}
trap update_size WINCH