명령이 중단될 경우 안전 장치 깨우기를 수행하기 위해 "watchdog" 기능을 사용합니다. 이는 30초 동안 휴면 상태에서 깨어나는 백그라운드 작업을 실행하여 수행됩니다. 시간 초과 기간 전에 상위 명령이 성공하면 스크립트는 워치독을 종료합니다.
함수를 파이프할 때(예: sed
출력 형식 지정) kill
백그라운드 작업에서 호출된 후에도 절전 모드 중에 멈춥니다. 무엇을 제공합니까?
이것은 MCVE입니다:
#! /bin/bash
function indent () { "$@" 2>&1 | sed 's/^/ /'; }
function sleeper () { sleep 1 && echo "Sleep complete."; }
function child () {
sleeper &
# ... do something that might hang here ...
local spid=$! echo "Invoked sleeper." | grep "sleep"
kill $spid
echo "Done child."
}
indent child
Sleeper가 종료된 경우에도 프로세스는 1초 동안 휴면 상태로 유지됩니다.
답변1
약간 수정하고 sleep
상위 PID를 사용하여 프로세스를 종료합니다 $spid
.
#! /bin/bash
function indent () { "$@" | sed 's/^/ /'; }
function sleeper () { sleep 1 && echo "Sleep complete."; }
function child () {
sleeper &
local spid=$!
echo "Invoked sleeper." | grep "sleep"
pkill -P "$spid" sleep
echo "Done child."
}
indent child
문제는 백그라운드 작업이 실행 중인 동안 종료될 때까지 보낸 신호를 sleep
실제로 수신하지 않는다는 것입니다. 위 명령은 백그라운드 작업 자체가 아닌 프로세스에 신호를 보냅니다 .TERM
sleep
pkill
sleep