watch git log ...
私は少し高価な注文を実行するウィンドウがあります。実際にはこのように見えるほど高価で、watch -n30 timeout 10 git log ...
システムにあまり害を及ぼさない。
ただし、これを30秒ごとに実行する必要はありません。 gitコマンドを実行するときにのみ実行できます。サポートwatch
されている場合は、更新したいときはいつでもSIGUSR1信号を送ることができ、コンピューティングのwatch
パフォーマンスが大幅に節約されます。
この目標をどのように達成できますか?
答え1
これはシェルスクリプトです。以下を行うために必要です。
- まだ何もしない
- 信号に対するフックの実行
そのような落とし穴は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