殺されて眠っている子供にパイプライン命令が中断されました

殺されて眠っている子供にパイプライン命令が中断されました

コマンドが中断された場合は、安全装置のウェイクアップを実行するために「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

スリーパーがシャットダウンしても、プロセスは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

おすすめ記事