살해되어 잠자는 아이에게 파이프라인 명령이 중단됨

살해되어 잠자는 아이에게 파이프라인 명령이 중단됨

명령이 중단될 경우 안전 장치 깨우기를 수행하기 위해 "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실제로 수신하지 않는다는 것입니다. 위 명령은 백그라운드 작업 자체가 아닌 프로세스에 신호를 보냅니다 .TERMsleeppkillsleep

관련 정보