一時停止したときにスクリプトに何かをエコーさせるにはどうすればよいですか?

一時停止したときにスクリプトに何かをエコーさせるにはどうすればよいですか?

一時停止端末スクリプトを使用しておりSIGSTOP、一時停止中であることを示すメッセージを印刷したいと思います。

  • トラップができなかったのでbeforeを送信してキャッチしようとしましたが、トラップに入れたコマンドSIGSTOPは最終的にスクリプトが再開された後に実行されます。SIGUSR1SIGSTOP
  • との間に置くとsleepトラップコマンドが実行されますが、スクリプトは受信される前にしばらく実行されます。SIGUSR1SIGSTOPSIGSTOP

外部からスクリプトに「一時停止中です」とエコーするように指示する方法はありますか?まもなく止まる?

編集:私はbashを使用しています。私のテストスクリプトは次のとおりです。

trap "echo Paused" SIGUSR1
trap "echo Restarted" SIGCONT

while : ; do
    echo `date`
    sleep 1
done

私はそれを「./blah.sh」と呼びます。

私の制御スクリプトは次のとおりです

script_id=`pidof -x blah.sh`
kill -SIGUSR1 $script_id
sleep 0.5
kill -SIGSTOP $script_id

sleep 2

script_id=`pidof -x blah.sh`
kill -SIGCONT $script_id

答え1

.seeSIGTSTPの代わりに使用する必要があります。SIGSTOPここ:

このSIGSTOP信号はプロセスを停止します。無視することも無視することもできません。 またはブロックされました。

このSIGTSTP信号は対話型停止信号です。SIGSTOPこれとは異なり 信号を処理して無視できます。

例は次のとおりです。

paused() {
    echo PAUSED
    kill -SIGSTOP $$ # This signal cannot be handled. Here the script is actually paused.
    echo CONTINUED
}
trap 'paused' SIGTSTP

例:

$ ./test_pause.sh & disown
[1] 18852
$ kill -TSTP 18852
PAUSED
$ kill -CONT 18852
CONTINUED

関連情報