信号を受信した後にのみ更新される時計はありますか?

信号を受信した後にのみ更新される時計はありますか?

watch git log ...私は少し高価な注文を実行するウィンドウがあります。実際にはこのように見えるほど高価で、watch -n30 timeout 10 git log ...システムにあまり害を及ぼさない。

ただし、これを30秒ごとに実行する必要はありません。 gitコマンドを実行するときにのみ実行できます。サポートwatchされている場合は、更新したいときはいつでもSIGUSR1信号を送ることができ、コンピューティングのwatchパフォーマンスが大幅に節約されます。

この目標をどのように達成できますか?

答え1

これはシェルスクリプトです。以下を行うために必要です。

  1. まだ何もしない
  2. 信号に対するフックの実行

そのような落とし穴はtrap 'git log' SIGUSR1完成します2.1.おおよそのシミュレーションと完璧に完了できます sleep $aLongTime

tmp=`mktemp`; echo 'int main(){ pause(); return 0; }' > "$tmp";
gcc -x c "$tmp" -o pause #create a `pause` executable

これにより、シェルスクリプトは次のようになります。

echo $$ #identify self
trap 'git log' SIGUSR1 
while :; do ./pause; done

答え2

以下はこの目的のための小さなPython 2.6プログラムです:

import signal,sys,os

cmdString = " ".join(sys.argv[1::]).strip()

def handler(sig,frame):
        if sig == signal.SIGUSR1:
                refresh()
        elif sig == signal.SIGINT:
                print 'You pressed Ctrl+C!'
                sys.exit(0)

def refresh():
        os.system(cmdString)
        print "\n"
        signal.pause()

signal.signal(signal.SIGINT, handler)
signal.signal(signal.SIGUSR1, handler)
print('Press Ctrl+C to exit')
refresh()

答え3

少し汚れていましたが、うまくいきます。

while :; do watch -n3600 git log ...; sleep 0.5; done

これは、USR1が受信されるとクロックが終了するという事実に依存する。ただし、信号が必要なときはいつでもエラーメッセージが端末に書き込まれます。これを抑制しても2>/dev/null効果はありません。watch端末と通信していないように見え、「ユーザー定義のシグナル」メッセージが引き続き表示されます。

周期をきれいに調整するには、睡眠が必要です。

答え4

シェル関数を生成し、特定の信号が受信されたら呼び出すことができます。watch作業に適したツールではありません。一定時間が経過すると発動します。時間ではなく信号に基づいてトリガーしたいです。

以下は、この機能を示す簡単なシェルスクリプトです。

#!/bin/sh

gitlog() {
  clear
  git log
}

while :; do
  trap gitlog USR1
done

exit 0

テストのために-を使用してスクリプトを終了kill <PID> -SIGUSR1できます。ctrlc

関連情報