신호를 받은 후에만 새로 고쳐지는 시계가 있나요?

신호를 받은 후에만 새로 고쳐지는 시계가 있나요?

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

관련 정보